`
tomhibolu
  • 浏览: 1375760 次
文章分类
社区版块
存档分类
最新评论

Linux设备模型(上)之底层模型

 
阅读更多

努力成为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,实际上是被嵌入到其他类型中的,甚至可能是其他的kset
  • ü 一个kobject的父节点不一定是包含它的kset

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设备模型(上)之底层模型.pdf

    Linux内核驱动书籍之《Linux设备模型(上)之底层模型.pdf 》,适合深入Linux内核。

    冬天的秘密-Linux设备模型二底层模型

    冬天的秘密-Linux设备模型二底层模型冬天的秘密-Linux设备模型二底层模型

    Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介) - Linux设备驱动程序

    Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介) - Linux设备驱动程序

    Linux设备驱动程序学习

    ·Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介) ·Linux设备驱动程序学习(13)-Linux设备模型(总线、设备、驱动程序和类) ·Linux设备驱动程序学习(14)-Linux设备模型(各环节的整合) ·Linux...

    linux io 模型

    linux io模型,区分阻塞非阻塞同步异步的概念,从底层理解io。

    Linux 驱动学习笔记pdf文档

    ·Linux设备驱动程序学习(12)-Linux设备模型(底层原理简介) ·Linux设备驱动程序学习(13)-Linux设备模型(总线、设备、驱动程序和类) ·Linux设备驱动程序学习(14)-Linux设备模型(各环节的整合) ·Linux...

    Linux常见驱动源码分析(kernel hacker修炼之道全集)--李万鹏

    Linux设备模型(上)之底层模型.pdf Linux驱动修炼之道-驱动中一些常见的宏.pdf Linux驱动修炼之道-内存映射.pdf Linux驱动修炼之道-看门狗框架源码分析.pdf Linux驱动修炼之道-触摸屏驱动之s3c2410_ts源码...

    从串口驱动到Linux驱动模型

    本文通过对Linux下串口驱动的分析。由最上层的C库。到操作系统系统调用层的封装,再到tty子系统的核心。...再到最底层的硬件操作从串口驱动到Linux驱动模型,从一个模型入手,详细的分析了流程,一些思想结构

    史上最强的嵌入式底层驱动开发课程 Linux系统开发+Linux高级程序+主板开发+ARM等

    ├&lt;1 Linux操作系统基础&gt; │ ├01 - 说在前面的话1.mp4 │ ├02 - 说在前面的话2.mp4 │ ├03 - 说在前面的话3.mp4 │ ├04 - 说在前面的话4.mp4 │ ├05 - 计算机组成原理概述1 .mp4 │ ├06 - 计算机组成原理概述2...

    基于Linux设备模型的单总线接口的设计 (2014年)

    在符合Linux内核设备模型[2]的前提下,实现一个稳定的单总线接口,将整个控制器分为顶层设备接口、核心层、底层硬件接口由上到下3个部分;同时对驱动和设备分离、顶层设备接口和具体硬件操作分离。

    Linux字符设备驱动框架笔记

    字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标、键盘、显示器、串口等等,当我们执行 ls -l /dev 的时候,能...

    基于Linux的USBoverIP系统设计

    方法,在驱动层将USB请求封装成IP包传送,在驱动底层实现远端USB设备 到本地的透明映射,不局限于特定的设备类别,这样完成和实现了局域网内 Linux主机之间的任意USB设备相互共享,并且不需要对原有USB系统结构有 ...

    嵌入式Linux应用程序开发标准教程(第2版全)

    接着系统地讲解了嵌入式Linux的环境搭建,以及嵌入式Linux的I/O与文件系统的开发、进程控制开发、进程间通信开发、网络应用开发、基于中断的开发、设备驱动程序的开发以及嵌入式图形界面的开发等,并且还安排了丰富...

    Android底层开发实战

    在简要介绍系统底层开发流程的基础上,首先分析了主流的Zynq和pcDuino平台上开发环境的搭建、Linux内核以及Android系统的编译、下载;然后结合前文学习过的知识点,从零开始设计LED显示系统的Linux内核驱动、Android...

    Linux 下的五种 IO 模型详细介绍

    操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分...

    linux内核代码解析

    为了完整的了解 Linux ,你需要了解底层硬件的基础知识。本章对于现代 PC 的硬件进行了。 &lt;br&gt; 1975 年 1 月“ Popular Electronics ”杂志封面上印出了 Altair 8080 的图片,一场革命开始了。 Altair 8080 ,...

    Android驱动开发权威指南

    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 ...

    kangle web服务器 v3.2.1 正式版 for linux.zip

    Windows上采用iocp、Linux上采用epoll、Bsd上采用kqueue。 5、功能强大、灵活 kangle的访问控制理念来自linux的iptables防火墙,kangle拥有功能最小化的匹配模块和标记模块,通过组合,反转等可以实现用户最复杂的...

    Linux程序设计 第4版.haozip01

    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...

    Linux程序设计 第4版.haozip02

    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...

Global site tag (gtag.js) - Google Analytics