自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (4)
  • 收藏
  • 关注

原创 详细分析contrex-A9的汇编代码__switch_to(进程切换)

//函数原型:版本linux-3.0.8struct task_struct *__switch_to(structtask_struct *,struct thread_info *, struct thread_info *); #define switch_to(prev,next,last)                                       \

2014-07-08 14:48:05 2976

原创 网卡驱动11-网卡中的广播地址 0x8000解释

经常在网卡里面看到广播地址,赋值为0x8000,网上几乎没人去解释这个东西。例如dm9000.    /* broadcast address */    hash_table[3] = 0x8000;u16 hash_table[4];这个是16位的表,我们知道mac广播地址是FF:FF:FF:FF:FF:FF那么为什么在这是个0x8000。这要结合一下硬件,dm9000

2014-04-02 16:24:44 2696

原创 v4l2驱动3-linux3.0.8中v4l2_format详解

首先是//四字符代码,为了标示视频数据流格式//在次文件的下,比如大家熟悉的mjpeg//#define V4L2_PIX_FMT_MJPEG v4l2_fourcc('M', 'J', 'P', 'G') /* Motion-JPEG *//* Four-character-code (FOURCC) */#define v4l2_fourcc(a, b, c, d)\

2014-03-25 16:53:22 9114

原创 v4l2驱动2-linux3.0.8中V4L2_CAP_*详解

这部分涉及不少专业支持,有些可能我的不好,请大家原谅!/* Values for 'capabilities' field */#define V4L2_CAP_VIDEO_CAPTURE 0x00000001 /* Is a video capture device */#define V4L2_CAP_VIDEO_OUTPUT 0x00000002 /* Is a video

2014-03-21 16:02:50 2962

原创 v4l2驱动1-linux-3.0.8的v4l2_dev.h分析

看一下drivers/media/video下的Makefile你会发现:videodev-objs:=v4l2-dev.o v4l2-ioctl.o v4l2-device.o v4l2-fh.o \                        v4l2-event.o v4l2-ctrls.o v4l2-subdev.o这是生成videodev.ko必要的文件。网上有很多讲解v4

2014-03-21 11:43:40 2220

原创 网卡驱动10-做一个与外界交互的虚拟网卡6(突发奇想!搞个网络鼠标!)

昨天晚上突然想到这个东西,今天花了一上午实现了!不过具体速度怎么样就不清楚了!首先是目的!一个系统上的鼠标去控制另一个系统。通过网线连接。方案!在一个系统上获取鼠标信息网传到另一个系统,接受信息的系统通过input机制上报。对于网传的接受,你可以在用户层去做,我是在内核层去做的,参考我之前搞的vnic代码。我就不废话了,直接代码:/* */#include #inclu

2014-02-26 14:26:36 2231 1

原创 网卡驱动9-linux内核3.0.8的mdio_bus\phy_device\phy_driver

上次说了MII还有RMII GMII RGMII、SGMII等,GMII:与MII接口相比,GMII的数据宽度由4位变为8位, 发送参考时钟GTX_CLK和接收参考时钟RX_CLK的频率均为125MHz(1000Mbps/8=125MHz)。支持MII模式。这个GMII可用于1000M网。RGMII:由于GMII线太多,RGMII把数据位宽变为4位,在时钟的上升沿和下降沿都采样

2014-02-24 11:09:06 7676 3

原创 网卡驱动8-MII接口以及linux内核对MII的支持

首先,向大家推荐一些文章。http://blog.chinaunix.net/uid-24148050-id-131084.htmlhttp://hi.baidu.com/lds102/item/eae3262c77b897de0f37f966http://blog.csdn.net/zyboy2000/article/details/4525726 这上面说了MII、RMII

2014-02-18 16:17:12 6178

原创 网卡驱动7-netpoll和ethtool,以及ethtool移植和驱动简单实现

netpoll的目的是让内核在网络和I/O子系统尚不能完整可用时,依然能发送和接收数据包。主要用于网络控制台(net console)和远程内核调试(KGDBoE)中。实现netpoll功能,主要是要实现kernel中的poll_controller函数,该函数定义:void (*poll_controller)(structnet_device *dev)。该函数的作用是在缺少设备中断的

2014-02-13 16:03:20 3261

原创 网卡驱动6-做一个与外界交互的虚拟网卡5(代码及调试)

驱动有三个文件:vnic.h vnic_core.c vnic_dev.c应用层:rcv.c send.c(发送程序是pc和arm板共用的)代码有注释,我就不详细解释了。如有疑问,欢迎讨论!vnic.h#ifndef __VNIC_H__#define __VNIC_H__#include #define VNIC_HLEN 4 /* The addi

2014-02-13 09:43:12 2599

原创 网卡驱动5-做一个与外界交互的虚拟网卡4(netif_receive_skb和非napi分析)

看了网上的一些对此函数的解析,有些比较旧了。我在这分析一下linux-3.0.8的代码。netif_receive_skb()中有RPS,我们不看了,直接看__netif_receive_skb()。static int __netif_receive_skb(struct sk_buff *skb){ struct packet_type *ptype, *pt

2014-02-12 11:38:34 2463

原创 网卡驱动4-做一个与外界交互的虚拟网卡3(调用真实网卡接收数据以及napi使用)

//vnic_rcv是接受vnic包的处理函数static int vnic_rcv(struct sk_buff *skb, structnet_device *dev, struct packet_type *ptype, struct net_device *orig_dev){ struct net_device *vnic_dev; struct vnic_p

2014-02-10 16:49:25 2655

原创 网卡驱动3-做一个与外界交互的虚拟网卡2(调用真实网卡发送数据)

之前说我我加入一个自己的协议,现在说一下我的协议的意思是每个数据包前加一个32位的数据,前16位是协议号,即ETH_IP_VNIC;后16位的高八位是’w’(我的姓的第一字母),低八位是虚拟网卡号。所以VNIC_HLEN是4。可以看一下结构体struct vnic_ethhdr/** * struct vnic_ethhdr - vnic ethernet header (ethhdr

2014-02-08 11:45:06 3270

原创 网卡驱动2-做一个与外界交互的虚拟网卡1(引用真实的网卡、自定义协议号注册)

之前的snull只能自娱自乐,我们来实现一个可以和外部通讯的虚拟网卡。这个虚拟网卡参考了vlan协议实现。重点我们说四个东西,引用真实的网卡、自定义协议号注册、发送和接受。Linux-3.0.8引用真实的网卡:单从程序上看就这一句:real_netdev = dev_get_by_name(&init_net, "eth0");dev_get_by_name()

2014-02-07 16:06:38 2286

原创 网卡驱动1-移植snull到linux-3.0.8

ldd3的代码版本太低了,我在此把它移植到linux-3.0.8并提供调试方法,希望对一些人有帮助可以与ldd3提供的源码比较这看。timeout那块有点问题,就不演示了。snull.h/* * snull.h -- definitions for the network module * * Copyright (C) 2001 Alessandro Rubini and

2014-02-07 11:45:00 2861 3

原创 块设备驱动3--sd卡驱动2(linux-3.2.36的host.h分析)

/* * linux/include/linux/mmc/host.h * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by th

2013-12-31 16:26:27 3120

原创 进程与内存10-高速缓存5(linux提供的操作接口)

要到年底了,忙的要死。这次我就偷偷懒了。只做一些提示,有兴趣看看。欢迎讨论!简单开场白:从之前的分析看,为了提高磁盘或内存的访问速度,都造成了同一数据会在不同的介质中同时存在。那么就可能因为某种原因造成数据不一致。对于硬件cache,如果是数据和指令分类的Cache分开,那么指令cache中的指令与数据cache中的数据之间也要一致。问题会更复杂。对应用层来说这些都是透明的,但是对

2013-12-27 09:35:16 1542

原创 进程与内存9-高速缓存4(硬件高速缓存)

这篇主要是讲cache的基础知识,从网上也可以搜到相关的。Cache的作用:为了缩小cpu和ram之间的速度不匹配,引入了硬件高速缓存内存。它基于著名的局部性原理。Cache的分类:a. 统一的。指令和数据用同一个Cache。b. 指令和数据分开的。有时这种组织方式也被称为改进的哈佛结构。 L1\L2\L3 cache的解释:L1 Cache(一级缓存)是CPU第一

2013-12-25 15:25:22 1989

原创 进程与内存8-高速缓存3(页高速缓存)

页高速缓存是linux内核所使用的主要磁盘高速缓存。在绝大多数情况下,内核在读写磁盘时都引用页高速缓存。新页被追加到页高速缓存以满足用户态进程的读请求。如果页不在高速缓存中,新页就被加到高速缓存中,然后用从磁盘读出的数据填充它。如果内存有足够的空闲空间,就让该页在高速缓存中长期保留,使其他进程再使用该页时不再访问磁盘。这样的机制也会引入类似“脏”字段来处理一致性。在此之前的高速缓存都是软件的机

2013-12-24 16:55:01 1243

原创 进程与内存7-高速缓存2(目录项高速缓存、索引节点高速缓存和磁盘高速缓存)

首先明白这两个概论:下面是我以前写的博客vfs中的话a. 超级块对象struct super_block:对应于存储特定文件系统的信息(如文件系统类型、文件大小上限、设备标识符等),磁盘文件放在特定扇区中,特殊文件如sysfs放在内存中,掉电后完完了。b. 索引节点对象struct inode:包含了内核在操作文件或目录时需要的全部信息。它表示文件类型、引用计数、访问时间等,如i_

2013-12-24 15:16:46 1752

原创 进程与内存6-高速缓存1(每CPU页框高速缓存和内存高速缓存)

首先我提几个主题:磁盘高速缓存、内存高速缓存、硬件高速缓存、每cpu页框高速缓存、页高速缓存、目录项高速缓存、索引节点高速缓存、转换后援缓冲器(TLB)、哈佛结构的高速缓存、写缓冲器、高速缓存一致性、L1和L2等高速缓存在驱动的使用。 上面这些就我在接下来的文章中要讨论的东西。如果您对上面的东西了如指掌,请接受的叩拜!真心希望您能给本屌丝指点指点。高速缓存大家喜欢叫cache。对于

2013-12-24 15:15:20 2688

原创 进程与内存5-mmap实现2(remap_pfn_range方法原理及实例)

这一篇是说mmap()的另一种实现方法,利用remap_pfn_page一次性映射。 先简单看看remap_pfn_page的源代码吧。这个代码有些函数基于平台基于版本。我的平台:arm920tlinux-3.2.36。先对参数解读:vma:用户层使用的vmaaddr:用户的起始地址pfn:内核空间的物理地址(内核这么写的)。我觉得只能说是内核空间地址。size:映射大

2013-12-16 17:07:18 6789 1

原创 进程与内存4-mmap实现1(nopage方法原理及实例)

假设现在有个有个驱动,有一段内存叫做sh_mem。当用户打开这个文件并mmap。mmap要做什么,当然是建立用户态的地址与此驱动建立对应关系。我知道的有两种:1. 我们给用户提供一个方法,如果你要用这个内存时才会映射。这就是请页机制。2. 我们一次映射好。这篇文章,我们先讲第一种,实验:arm平台linux-3.2.36如果你只想看看nopage使用方法,就直接倒下面代码去。中间就

2013-12-13 15:50:07 4462

原创 进程与内存3-内存管理(解析并获取高低端内存)

ldd3的一段话:高效的块驱动对于性能是重要的 -- 不只是为在用户应用程序的明确的读和写. 现代的有虚拟内存的系统将不需要的数据移向(希望地)二级存储中, 它常常是一个磁盘驱动器. 块驱动是核心内存和二级存储之间的导管; 因此, 它们可组成虚拟内存子系统的一部分. 虽然可能编写一个块驱动不必知道 struct page 和其他重要的内存概念, 任何需要编写一个高性能驱动的人必

2013-12-11 14:23:30 2253 4

原创 进程与内存2-内核线程应用(简单实例)

这个节是建立内核线程的例子(linux-3.2.36)就是循环打印,有几个宏我说明一下KERNEL_THREAD: 用kernel_thread()建立线程KTHREAD_CREATE: 用kthread_create()建立线程REALTIME_THREAD:使用fifo调度策略CNT:打印的次数,自己玩玩吧,不多说了。#include #include /

2013-12-09 09:39:38 1995

原创 进程与内存1-内核线程建立

以前写的东西,感觉写的过于繁琐,从这以后尽量写的简洁明朗一点,也有助于我自己以后再看。(内核版本linux-3.2.36)我们要解决的问题。1.      简单描述内核线程创建过程。2.      为什么kthread_create()调用后,我们还要调用wake_up_process来唤醒调用我们的线程函数,用户态并不需要。 kthread_create(threadfn,

2013-12-03 11:03:32 1636

原创 块设备驱动2--sd卡驱动1(linux-3.2.36的sdchi.h分析)

我的经历:看了某些大神的说明,我胆怯地进入了drivers/mmc/host/,看过我之前的文章知道我用的是s3c2440。看驱动时,我首先会找s3c字样,于是我注意到sdhci-s3c.c和s3cmci.c。看了一下Kconfigconfig MMC_S3C    tristate "Samsung S3C SD/MMC Card Interface support"

2013-10-31 13:11:46 5095 1

原创 块设备驱动1--自编ramdisk(在linux-3.2.36上的新接口)

这是块设备驱动的第一期,我们就从ldd3的sbull开始吧,但是ldd3用的linux版本太老了,你直接用它的例子在linux-3.2.x上是很麻烦的。我主要做的就是在高版本上的移植。里面有个NOQUEUE宏,可以选择不用一个请求队列 。自己对着ldd3中的讲解看看吧/*********************************** Copyright(C), 2013

2013-10-26 15:00:21 1420

原创 自娱自乐10之Linux DMA使用2(DMA使用实例,用timer作DMA请求源实现流水灯)

我想大家听过流水灯的实现,有很多方法,有一种是用定时器实现的。通常是利用定时器中断,今天我要用timer作为DMA请求源,当timer时间到启动DMA传输,这样把一个一个数送的gpio口。实现流水灯下面是代码,我的流水灯只流一次,平台是s3c2440/*********************************** Copyright(C), 2013 LDP FileN

2013-10-18 12:55:56 3863

原创 自娱自乐9之Linux DMA使用1(三星平台DMA分析)

和以前一样,我不说dma基础知识,你可以看看ldd3这次我说的是三星平台的dma,不是三星的某款芯片的dma使用。这主要得益于三星公司统一了接口。比如我后有的例子是在s3c2440上做的但是我是参考s3c64xx的spi驱动。当然内核还是linux-3.2.36,我们看dma-ops.h/* arch/arm/plat-samsung/include/plat/dma-ops.

2013-10-18 12:44:34 3902

原创 自娱自乐8之Linux UDC驱动4(自编udc驱动,基本功能完成)

直接上代码,可以和我之前写的模板比较比较/*********************************** Copyright(C), 2013 LDP FileName: s3c2440_udc.h Author: wwxxxxll Date: Description: History: Author Date

2013-10-11 16:34:24 2464

原创 linux-3.2.36内核启动4-setup_arch中的内存初始化3(arm平台 bootmem_init源码分析)

void__init bootmem_init(void){        unsigned long min, max_low, max_high;         max_low = max_high = 0;         find_limits(&min, &max_low,&max_high);static void __init find_limits(u

2013-10-11 15:24:13 2362

原创 linux-3.2.36内核启动3-setup_arch中的内存初始化2(arm平台 分析建立页表)

再介绍pageing_init之前,我们了解几个定义pte_t 页表项pmd_t 页中间目录项pud_t 页上级目录pgd_t 页全局目录项我的arm平台#define PMD_SHIFT                21#define PGDIR_SHIFT               21 下面这个函数paging_init每个平台实现不一样,我的根本就没

2013-10-01 22:08:10 2784

原创 linux-3.2.36内核启动2-setup_arch中的内存初始化1(arm平台 分析高端内存和初始化memblock)

上一篇微博留下了这几个函数,现在我们来分析它们        sanity_check_meminfo();        arm_memblock_init(&meminfo, mdesc);        paging_init(mdesc);        request_standard_resources(mdesc); 在上一微博有展现根据启动参数初始化memi

2013-09-27 14:29:47 3525 3

原创 linux-3.2.36内核启动1-启动参数(arm平台 启动参数的获取和处理,分析setup_arch)

最近公司要求调试一个内核,启动时有问题,所以就花了一点时间看看内核启动。看的过程中总结了一点东西,希望可以帮助大家调试内核。当我开始看的时候,第一件事是从网上搜集资料,不看不知道,一看吓一跳!牛人太多了,像这种内核启动的上古代码早就被人分析的彻彻底底。这注定我写的只能是烂微博了。为了此微博有存在的必要,我会显示内核启动打印的代码位置(用绿色表示)及出现错误打印的原因(用红色表示),同时

2013-09-27 14:08:35 2996 2

原创 自娱自乐7之Linux UDC驱动2(自编udc驱动,现完成枚举过程,从驱动代码分析枚举过程)

花了半个月,才搞定驱动中的枚举部分,现在说linux的枚举,windows可能有差别。代码我会贴在后面,现在只是实现枚举,你可能对代码不感兴趣,我就不分析代码了,你可以看看在《自娱自乐1》中的模板,比较一下,我做了什么,这会给你写udc驱动提供个思路。我直接分析调试打印,就是枚举过程,我们从代码看枚举。打印位置可以在下面的代码里找到。如果你要弄懂驱动代码中涉及枚举的地方,你就仔细看

2013-09-13 17:51:28 2835 4

原创 自娱自乐6之Linux gadget驱动5(自编gadget驱动,包涵与之通讯的主机usb驱动,已调试通过)

这个代码调试,你首先要保证你的udc驱动没用问题,这个有些矛盾,应为我本来要用gadget驱动来调试udc驱动,结果反过来了。这是在zero基础改的,大概的改动1. 去掉loop。2. sink的读写去掉了。3. 增加了一个misc,通过fs去读写数据。4. setup的特殊请求去掉了。之前的文章已经把大部分的东西说完了,所以代码没有太多的注释。请结合之前的文章阅读。

2013-08-29 15:13:44 4465 4

原创 自娱自乐5之Linux gadget驱动4(接受发送,complete函数,setup函数)

f_sourcesink.c里面在执行set_alt方法后就调用source_sink_start_ep(),这里面就有usb_ep_queue()可以认为开始进行数据交互。后期我要改一下这个过程,通过一个简单的misc驱动去分开调用接受发送我们现在看static int source_sink_start_ep(struct f_sourcesink *ss,boolis_in)

2013-08-28 17:08:45 3847

原创 自娱自乐4之Linux gadget驱动3(bind过程)

bind和字符串描述符一样也是有多级关系,首先说一下usb很基础的关系一个设备可能有多个配置一个配置可能有多个接口一个接口可能有多个端点或设置还记得我在自娱自乐2中说的的结构体吧我们先变通一下struct usb_function 相当于接口struct usb_configuration 相当于配置struct usb_composite_dev 相当于设备b

2013-08-28 10:00:24 2537

原创 自娱自乐3之Linux gadget驱动2(zero中的字符串描述符)

这个gadget驱动我会一部分一部分说(你可以对着zero.c看),最后给个完整的。今天说的是字符串描述符,struct usb_gadget_strings我之前说是字符串描述符并不准确,真正的描述符是struct usb_string_descriptor上一篇说的结构体中有很多都包涵了struct usb_gadget_strings,它们是struct usb_functi

2013-08-27 14:15:59 3298 1

linux v4l2 spec ch

linux video for linux 2驱动的用户层和内核驱动开发。不错的中文翻译,对英文不好的朋友有很大帮助

2014-03-21

ethtool源代码

linux系统用的ethtool源代码,如果在一些嵌入式平台没有此工具,可以下载下来进行编译移植

2014-02-13

linux总线实例

linux总线实例,基于linux-3.2.36,用的vs编辑,里面有^M符号,不要管它。

2013-07-11

自制linux驱动学习软件

自制linux驱动学习软件,适合初学者,有什么建议请回复我,谢谢!!!

2013-07-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除