努力成为linux kernel hacker的人李万鹏原创作品,转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2011/05/05/6396618.aspx
如果哪里有理解不对的请指教,文章引用的内核源码版本为2.6.29.1的。
建立设备模型主要为了管理方便。最初引入设备模型是为了电源管理。建立一个全局的设备树(device tree),当系统进入休眠时,系统可以通过这棵树找到所有的设备,随时让他们挂起(suspend)或者唤醒(resume)。
2.6版内核提供的功能:
电源管理和系统关机
完成这些工作需要对一些系统结构的理解。比如一个USB宿主适配器,在处理完所有与其连接的设备前是不能被关闭的。设备模型使得操作系统能够以正确的顺序遍历硬件。
与用户空间通信
sysfs虚拟文件系统的实现与设备模型密切相关,并且向外界展示了它所表示的结构。向用户空间所提供的系统信息,以及改变操作参数的接口,将越来越多的通过sysfs实现,也就是说通过设备模型实现。
热插拔设备
内核中的热插拔机制可以处理热插拔设备,特别是能够与用户空间进行关于热插拔设备的通信,而这种机制也是通过热插拔管理的。
设备类型
把设备分门别类有助于设备的管理与使用。比如要找USB鼠标,只要去classes/input/里去找就可以了,而不必关心这个鼠标是接到哪个USB主机控制器的哪个Hub的第几个端口上。
对象生命周期
得有一个好的机制来实现设备生命周期的管理。比如把USB鼠标拔了之后,全局设备树和sysfs里面得相应去掉。
设备底层模型:
Linux设备模型的底层是数据结构kobject,内核用kobject结构将各个对象连接起来组成一个分层的结构体系,从而与模块化的子系统相匹配。一个kset是嵌入相同类型结构的kobject集合。kset和他的kobject的关系与下图类似,请记住:
Kobject是组成设备模型的基本结构,最初他只是被理解为一个简单的引用计数,但是随着时间的推移,他的任务越来越多,因此也有了许多成员,他的结构体如下:
name指向设备的名字,entry,parent,kset就是用来形成树状结构的指针。Kobj_type *type用来表示该kobject的类型,struct sysfs_dirent类型的指针指向了该kobject在sysfs中的目录实体,sysfs中每一个dentry都会对应一个sysfs_dirent结构。每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。/sys是专为Linux设备模型建立的,kobject是帮助建立/sys文件系统的。每当我们新增一个kobject结构时,同时会在/sys下创建一个目录。这里隐藏了如下程序调用流程:kobject_add()->kobject_add_varg()->kobject_add_internal()->create_dir()->sysfs_new_dirent()。在sysfs_new_dirent()函数中通过slab分配了一个dirent(至于什么是dirent会在<Linux设备模型(下)之sysfs文件系统>中讲解),并返回给一个指向这个dirent的指针sd给create_dir(),在create_dir()函数中有这么一句:sd->s_dir.kobj = kobj;也就是让dirent的一个成员的域指向了他所对应的kobject,kobject中struct sysfs_dirent *sd;又指向了dirent,所以kobject与sysfs死死的拥抱在一起,为了幸福的明天。在kobject_del()函数中会调用sysfs_remove_dir(),sysfs_remove_dir()中有这么一句:kobj->sd = NULL;表示kobject与sysfs_dirent的婚姻破裂了。
kobject的接口函数:
kobject初始化函数,设置kobject引用计数为1。
设置kobject的名字。
减少和增加kobject的引用计数。
kobject注册函数,该函数只是kobjec_init和kobject_add_varg的简单组合。旧内核称为
从Linux设备层次中(hierarchy)中删除kobj对象。
包含在kset中的所有kobject被组织成一个双向循环链表,list真是该链表的链表头。kset数据结构还内嵌了一个kobject对象(由kobj表示),所有属于这个kset的kobject对象的parent域均指向这个内嵌的对象。此外,kset还依赖于kobj维护引用计数:kset的引用计数实际上就是内嵌的kobject对象的引用计数。
释放kobject使用release函数,release函数并没有包含在kobject自身内,他包含在与kobject相关联的kobj_type中。sysfs_ops是指向如何读写的函数的指针。
show相当于read,store相当于write。
struct attribute **default_attrs;是属性数组。在sysfs中,kobject对应目录,kobject的属性对应这个目录下的文件。调用show和store函数来读写文件,就可以得到属性中的内容。
一个热插拔事件是从内核空间发送到用户空间的通知。它表明系统配置出现了变化。无论kobject被创建还是被删除,都会产生这种事件。比如,当数码相机通过USB线缆插入到系统时。热插拔事件会导致对/sbin/hotplug程序的调用,该程序通过加载驱动程序,创建设备节点,挂装分区,或者其他正确的动作来响应。对热插拔事件的控制由保存在 结构体中的函数完成:
我们可以在kset结构的hotplug_ops成员中发现指向这个结构的指针。如果在kset中不包含一个指定的kobject,内核将在分层结构中进行搜索(通过parent指针),直到找到一个包含有kset的kobject为止,然后使用这个kset的热插拔操作。下面是一个测试的程序:
kobject.c
kset.c
测试效果:
如果将kset_c.kobj.kset = &kset_p;这行注释掉,也就是不产生热插拔事件,效果如下:
无论什么时候,当内核要为指定的kobject产生事件时,都要调用filter函数。如果filter返回0,将不产生事件,这里将返回值改为0,看效果:
下边是kobject的测试效果:
分享到:
相关推荐
Linux内核驱动书籍之《Linux设备模型(上)之底层模型.pdf 》,适合深入Linux内核。
冬天的秘密-Linux设备模型二底层模型冬天的秘密-Linux设备模型二底层模型
Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介) - Linux设备驱动程序
·Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介) ·Linux设备驱动程序学习(13)-Linux设备模型(总线、设备、驱动程序和类) ·Linux设备驱动程序学习(14)-Linux设备模型(各环节的整合) ·Linux...
linux io模型,区分阻塞非阻塞同步异步的概念,从底层理解io。
·Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介) ·Linux设备驱动程序学习(13)-Linux设备模型(总线、设备、驱动程序和类) ·Linux设备驱动程序学习(14)-Linux设备模型(各环节的整合) ·Linux...
Linux设备模型(上)之底层模型.pdf Linux驱动修炼之道-驱动中一些常见的宏.pdf Linux驱动修炼之道-内存映射.pdf Linux驱动修炼之道-看门狗框架源码分析.pdf Linux驱动修炼之道-触摸屏驱动之s3c2410_ts源码...
本文通过对Linux下串口驱动的分析。由最上层的C库。到操作系统系统调用层的封装,再到tty子系统的核心。...再到最底层的硬件操作从串口驱动到Linux驱动模型,从一个模型入手,详细的分析了流程,一些思想结构
├<1 Linux操作系统基础> │ ├01 - 说在前面的话1.mp4 │ ├02 - 说在前面的话2.mp4 │ ├03 - 说在前面的话3.mp4 │ ├04 - 说在前面的话4.mp4 │ ├05 - 计算机组成原理概述1 .mp4 │ ├06 - 计算机组成原理概述2...
在符合Linux内核设备模型[2]的前提下,实现一个稳定的单总线接口,将整个控制器分为顶层设备接口、核心层、底层硬件接口由上到下3个部分;同时对驱动和设备分离、顶层设备接口和具体硬件操作分离。
字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标、键盘、显示器、串口等等,当我们执行 ls -l /dev 的时候,能...
方法,在驱动层将USB请求封装成IP包传送,在驱动底层实现远端USB设备 到本地的透明映射,不局限于特定的设备类别,这样完成和实现了局域网内 Linux主机之间的任意USB设备相互共享,并且不需要对原有USB系统结构有 ...
接着系统地讲解了嵌入式Linux的环境搭建,以及嵌入式Linux的I/O与文件系统的开发、进程控制开发、进程间通信开发、网络应用开发、基于中断的开发、设备驱动程序的开发以及嵌入式图形界面的开发等,并且还安排了丰富...
在简要介绍系统底层开发流程的基础上,首先分析了主流的Zynq和pcDuino平台上开发环境的搭建、Linux内核以及Android系统的编译、下载;然后结合前文学习过的知识点,从零开始设计LED显示系统的Linux内核驱动、Android...
操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分...
为了完整的了解 Linux ,你需要了解底层硬件的基础知识。本章对于现代 PC 的硬件进行了。 <br> 1975 年 1 月“ Popular Electronics ”杂志封面上印出了 Altair 8080 的图片,一场革命开始了。 Altair 8080 ,...
5.1.2设备驱动与Linux文件系统的关联 5.2 Linux设备文件系统 5.2.1 devfs设备文件系统 5.2.2 udev设备文件系统 5.2.3 sysfs文件系统与Linux设备 5.2.4 udev的组成 5.2.5 udev规则文件 第6章Linux字符设备驱动 6.1 ...
Windows上采用iocp、Linux上采用epoll、Bsd上采用kqueue。 5、功能强大、灵活 kangle的访问控制理念来自linux的iptables防火墙,kangle拥有功能最小化的匹配模块和标记模块,通过组合,反转等可以实现用户最复杂的...
3.4 底层文件访问 82 3.4.1 write系统调用 82 3.4.2 read系统调用 83 3.4.3 open系统调用 84 3.4.4 访问权限的初始值 85 3.4.5 其他与文件管理有关的系统调用 88 3.5 标准i/o库 91 3.5.1 fopen函数 91 3.5.2...
3.4 底层文件访问 82 3.4.1 write系统调用 82 3.4.2 read系统调用 83 3.4.3 open系统调用 84 3.4.4 访问权限的初始值 85 3.4.5 其他与文件管理有关的系统调用 88 3.5 标准i/o库 91 3.5.1 fopen函数 91 3.5.2...