linux驱动程序之-设备驱动模型
bingqingsuimeng
这个作者很懒,什么都没留下…
展开
-
linux内核组件分析之--设备驱动模型之bus
前面我们分析了设备驱动模型中的device和driver,device和driver本来是不相关的东西,只因为bus的存在,才被联系到了一起。本节就来看看设备驱动模型中起枢纽作用的bus。本节的头文件在include/linux/device.h和drivers/base/base.h,实现代码主要在bus.c中。因为在bus中有很多代码时为了device找到driver或者driver找到dev转载 2012-08-31 14:42:49 · 1435 阅读 · 0 评论 -
Device Tree Usage
设备树使用手册This page walks through how to write a device tree for a new machine. It is intended to provide an overview of device tree concepts and how they are used to describe a machine.本文将介绍如何转载 2013-01-15 10:28:59 · 5200 阅读 · 1 评论 -
insmod 加载模块的过程
insmod 是靠一个在kernel/module.c里定义的系统调用来实现的。1. 此系统调用(sys_init_module )分配内核存储空间(kernel memory)给相关的模块,这个内存分配动作是由vmalloc完成;2. 然后将该模块内容拷贝到这块存储空间里;3. 接着声明内核引用该模块;4. 呼叫该模块的初始化涵数这样,一个插入模块的过程就转载 2012-12-04 14:14:09 · 2227 阅读 · 0 评论 -
Device 与 platform device的不同(一)
Device 与 platform device 在注册方法上有所不同。Device 注册有两步,platform device注册也有两步,它们第一步相同,都是initialize设备,但第二步有所不同,Device是直接调用device_add()函数来add设备,而platform device则调用platform_device_add()函数。实际上,platfo转载 2012-12-04 14:10:52 · 1395 阅读 · 0 评论 -
linux内核组件之---设备驱动模型之device-driver
前面我们分析了device、driver、bus三种类型,主要是三者的注册与注销,在sysfs中的目录与属性文件创建等内容。本节就来详细分析下,在设备注册到总线上时,总线是如何为其寻找对应的驱动的;在驱动注册到总线上时,总线又是如何为其寻找对应的设备的。本节的实现代码集中在drivers/base/bus.c和drivers/base/dd.c中。先来回忆下,在device_reg转载 2012-08-31 14:43:52 · 1900 阅读 · 0 评论 -
linux内核部件--通用双向链表list
在linux内核中,有一种通用的双向循环链表,构成了各种队列的基础。链表的结构定义和相关函数均在include/linux/list.h中,下面就来全面的介绍这一链表的各种API。struct list_head { struct list_head *next, *prev; }; 这是链表的元素结构。因为是循环链表,表头和表中节点都是这一结构。有prev和转载 2012-08-31 14:35:15 · 1336 阅读 · 0 评论 -
linux内核部件分析之——设备驱动模型之class
前面看过了设备驱动模型中的bus、device、driver,这三种都是有迹可循的。其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动。但本节要介绍的class,是设备类,完全是抽象出来的概念,没有对应的实体。所谓设备类,是指提供的用户接口相似的一类设备的集合,常见的设备类的有block、tty、input、usb等等。 class对应的代码转载 2012-08-31 14:51:11 · 9940 阅读 · 0 评论 -
linux内核部件之---设备驱动模型的基石kobject
之前我们分析了引用计数kref,总结了sysfs提供的API,并翻译了介绍kobject原理及用法的文档。应该说准备工作做得足够多,kobject的实现怎么都可以看懂了,甚至只需要总结下API就行了。可我还是决定把kobject的实现代码从头分析一遍。一是因为kobject的代码很重要,会在设备驱动模型代码中无数次被用到,如果不熟悉的话可以说是举步维艰。二是为了熟悉linux的编码风格,为以后分析转载 2012-08-31 14:38:57 · 1627 阅读 · 0 评论 -
linux内核部件之---原子性操作atomic_t
在任何处理器平台下,都会有一些原子性操作,供操作系统使用,我们这里只讲x86下面的。在单处理器情况下,每条指令的执行都是原子性的,但在多处理器情况下,只有那些单独的读操作或写操作才是原子性的。为了弥补这一缺点,x86提供了附加的lock前缀,使带lock前缀的读修改写指令也能原子性执行。带lock前缀的指令在操作时会锁住总线,使自身的执行即使在多处理器间也是原子性执行的。xchg指令不带lock前转载 2012-08-31 14:36:32 · 3545 阅读 · 0 评论 -
linux内核部件--又见链表之klist
前面我们说到过list_head,这是linux中通用的链表形式,双向循环链表,功能强大,实现简单优雅。可如果您认为list_head就是链表的极致,应该在linux链表界一统天下,那可就错了。据我所知,linux内核代码中至少还有两种链表能占有一席之地。一种就是hlist,一种就是本节要介绍的klist。虽然三者不同,但hlist和klist都可以看成是从list_head中发展出来的,用于特殊转载 2012-08-31 14:32:53 · 3273 阅读 · 0 评论 -
linux内核组件分析之---设备驱动模型之driver
上节我们分析设备驱动模型中的device,主要是drivers/base/core.c,可以说是代码量最大的一个文件。本节要分析的驱动driver,就要相对简单很多。原因也很简单,对于driver,我们能定义的公共部分实在不多,能再sysfs中表达的也很少。本节的分析将围绕drivers/base/driver.c,但头文件仍然是include/linux/device.h和drivers/bas转载 2012-08-31 14:41:49 · 1361 阅读 · 0 评论 -
linux内核部件之--记录生命周期的kref
kref是一个引用计数器,它被嵌套进其它的结构中,记录所嵌套结构的引用计数,并在计数清零时调用相应的清理函数。kref的原理和实现都非常简单,但要想用好却不容易,或者说kref被创建就是为了跟踪复杂情况下地结构引用销毁情况。所以这里先介绍kref的实现,再介绍其使用规则。kref的头文件在include/linux/kref.h,实现在lib/kref.c。闲话少说,上代码。s转载 2012-08-31 14:37:36 · 1304 阅读 · 0 评论