您的位置:首页 > 运维架构 > Linux

请教几个Linux设备驱动模型的问题

2013-01-02 12:32 323 查看
http://bbs.chinaunix.net/thread-3691002-1-1.html

1、Linux设备驱动模型是如何将bus、device和driver关联起来的?它们之间的数据结构关系如何?

2、platform device的设备文件结点是如何注册的?如何与file_operations关联的?

3、sysfs的作用是什么?如何利用它

4、class的作用是什么?内核使用它有什么样的好处?

对Linux设备驱动模型的理解很模糊,一口气提了很多问题。这一部分的内核代码组织比较复杂,如果没有指引,要完全弄明白很不容易。请各位高手指点下,不用回答的很详细,只需要指出内核中的关键代码位置。如果有很好的相关资料也可以提供下,谢谢。
本版精华

文库|博客

linux情景分析非扫描带书签版本

绝对精品--linux 内核代码构架图

Linux内核解读入门

Linux内存:内存管理的实质

kallsyms的分析

用户空间内核空间ipc总结(sockopt,ioctl,mmap,netlink,proc,seq,file,copy_user)

《Interrupt in Linux(硬件篇)》(1楼有更新 2008.5.3)

内核通知链 学习笔记

学习linux内核时,模仿linux编写的操作系统

Linux内核发送构造数据包的方式

一列数据存了一组不连续的正整数,求一SQL查 ... | 怎样看某条记录存放在哪个数据块?谢谢 | ora-600错误,急等大牛解决! | 不明白内连接和等值连接有什么区别,貌似一
...
Godbach

To be 千里马!





版主





帖子
14952
主题
368
精华
21
可用积分
11397
专家积分
79
在线时间
6431 小时
注册时间
2007-03-09
最后登录
2013-01-02

串门

好友

博客

消息

论坛徽章:
0

2楼[报告]


发表于
2012-03-26 17:31:48 |只看该作者

回复 1# frank529

第 1 个问题,可以看一下 《深入理解 Linux 网络技术内幕》的相关章节,图文并茂,讲解的很详细。

----------

欢迎光临Godbach的博客交流技术问题:

Godbach's
Blog

---------

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!

MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
frank529





白手起家

帖子
93
主题
23
精华
0
可用积分
159
专家积分
0
在线时间
241 小时
注册时间
2008-05-21
最后登录
2012-12-07

串门

好友

博客

消息

论坛徽章:
0

3楼[报告]


发表于
2012-03-26 17:51:23 |只看该作者

回复 2# Godbach

原来这本书上有讲,回头得好好看看
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
asuka2001

笨鸟须先飞 菜鸟须勤奋





丰衣足食



帖子
326
主题
6
精华
0
可用积分
652
专家积分
0
在线时间
1021 小时
注册时间
2010-08-11
最后登录
2012-12-05

串门

好友

博客

消息

论坛徽章:
0

4楼[报告]


发表于
2012-03-26 17:54:19 |只看该作者

回复 1# frank529

关键代码就在drivers/base/core.c, drivers/base/driver.c两个里吧;顺着device_register(), driver_register()往下扒拉,可以看清楚整个设备子系统怎么管理设备和驱动的,要下班了,有需要回家再给你拉条线。。。

迷失在Linux的海洋里

MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
frank529





白手起家

帖子
93
主题
23
精华
0
可用积分
159
专家积分
0
在线时间
241 小时
注册时间
2008-05-21
最后登录
2012-12-07

串门

好友

博客

消息

论坛徽章:
0

5楼[报告]


发表于
2012-03-26 18:01:13 |只看该作者

本帖最后由 frank529 于 2012-03-26 18:08 编辑

回复 3# asuka2001

回答得很妙,颇有fudan_abc大牛的风采。不过还有几个地方没明白:

1、如果platform_device不创建设备节点,那上层应用怎么使用它呢?比如我刚搞了一个RTC的驱动,板子初始化时注册平台设备,driver目录下对应的RTC驱动文件注册平台驱动,我在上层用hwclock命令就能实现对RTC的读写。

2、关于第二问我只是想拿platform设备举个例子,可能举错了,换个问法:传统的设备驱动需要手动mknod创建设备节点,2.6的设备驱动模型是怎样创建设备节点的呢?比如我用过class的某个注册设备的函数自动生成设备节点(具体函数名忘记了- -)

3、sysfs大概是怎么组织的呢?比如某个设备文件的attribute信息可能同时隶属于bus、class等目录里,其中某个目录下的该文件可能是另一个目录下同名文件的link。这种组织方式有什么规律吗?还是写代码的人调用sysfs的相关函数随意指定的。
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
asuka2001

笨鸟须先飞 菜鸟须勤奋





丰衣足食



帖子
326
主题
6
精华
0
可用积分
652
专家积分
0
在线时间
1021 小时
注册时间
2010-08-11
最后登录
2012-12-05

串门

好友

博客

消息

论坛徽章:
0

6楼[报告]


发表于
2012-03-26 19:33:14 |只看该作者

回复 6# frank529

我尝试一个一个回答吧,希望对你有帮助!

1、如果platform_device不创建设备节点,那上层应用怎么使用它呢?比如我刚搞了一个RTC的驱动,板子初始化时注册平台设备,driver目录下对应的RTC驱动文件注册平台驱动,我在上层用hwclock命令就能实现对RTC的读写。

不是所有的device都希望注册设备节点,让用户空间直接使用的。platform_device其实一般都是直接集成到CPU上的,尤其以嵌入式设备最常见!就物理上来说它是一堆寄存器,你注册个设备节点让用户使用,这让人家情何以堪!

platform_device可以向内核里的一些抽象层注册(比如usb core, mmc core, framebuffer),提供指定的功能给上层模块使用。所以用户空间是间接的使用到它!

当然如果platform_device够简单,它也可以直接被使用。不过这个并不是在注册platform_driver或platform_device的时候完成的。一般是在probe()里再注册另外的字符设备驱动,创建设备节点,这样完成的!

迷失在Linux的海洋里

MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
asuka2001

笨鸟须先飞 菜鸟须勤奋





丰衣足食



帖子
326
主题
6
精华
0
可用积分
652
专家积分
0
在线时间
1021 小时
注册时间
2010-08-11
最后登录
2012-12-05

串门

好友

博客

消息

论坛徽章:
0

7楼[报告]


发表于
2012-03-26 19:40:48 |只看该作者

回复 6# frank529

2、关于第二问我只是想拿platform设备举个例子,可能举错了,换个问法:传统的设备驱动需要手动mknod创建设备节点,2.6的设备驱动模型是怎样创建设备节点的呢?比如我用过class的某个注册设备的函数自动生成设备节点(具体函数名忘记了- -)

这个是靠uevent事件完成的,在device_register(), driver_register()里都会调用kobject_uevent()来通知用户空间,然后用户空间应该有个ueventd进程来处理。具体过程我没去仔细研究过。

至于class注册设备来自动生成设备节点,你说的应该是device_create(),只不会其实它也是调用device_register()而已!

迷失在Linux的海洋里

MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
asuka2001

笨鸟须先飞 菜鸟须勤奋





丰衣足食



帖子
326
主题
6
精华
0
可用积分
652
专家积分
0
在线时间
1021 小时
注册时间
2010-08-11
最后登录
2012-12-05

串门

好友

博客

消息

论坛徽章:
0

8楼[报告]


发表于
2012-03-26 19:56:46 |只看该作者

回复 6# frank529

3、sysfs大概是怎么组织的呢?比如某个设备文件的attribute信息可能同时隶属于bus、class等目录里,其中某个目录下的该文件可能是另一个目录下同名文件的link。这种组织方式有什么规律吗?还是写代码的人调用sysfs的相关函数随意指定的。

sysfs里的任意一个kobj都应该会创建1个目录。比如bus, device, driver等都是有1个kobj的。而目录所在的位置应该是kobj->parent所对应的目录里。

比如对于device来说,它是处于它的父设备的目录下的,然后在driver,bus, class等其他地方就是link过来。

至于这部分代码,你可以看device_add()里的一些函数调用,就是专门处理这个的:

......

error = device_create_file(dev, &uevent_attr);

......

error = device_create_file(dev, &devt_attr);

......

error = device_create_sys_dev_entry(dev);

......

error = device_add_class_symlinks(dev);

......

error = device_add_attrs(dev);

......

error = bus_add_device(dev);

error = device_add_attrs(bus, dev);

if (error)

goto out_put;

error = sysfs_create_link(&bus->p->devices_kset->kobj,

&dev->kobj, dev_name(dev));

if (error)

goto out_id;

error = sysfs_create_link(&dev->kobj,

&dev->bus->p->subsys.kobj, "subsystem");

......

bus_probe_device(dev);

ret = device_attach(dev);

ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach);

__device_attach();

driver_probe_device(drv, dev);

ret = really_probe(dev, drv);

if (driver_sysfs_add(dev)) {

......

没仔细注意是不是列完了,大概的函数调用链应该还是比较清楚了,你可以自己追踪下!

迷失在Linux的海洋里

MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
asuka2001

笨鸟须先飞 菜鸟须勤奋





丰衣足食



帖子
326
主题
6
精华
0
可用积分
652
专家积分
0
在线时间
1021 小时
注册时间
2010-08-11
最后登录
2012-12-05

串门

好友

博客

消息

论坛徽章:
0

9楼[报告]


发表于
2012-03-26 20:10:49 |只看该作者

饿。。。没仔细排版,上面的代码看起有点乱,我缩进代表的是函数调用链:)
迷失在Linux的海洋里

MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
UnixKiller_Ama





白手起家

帖子
28
主题
1
精华
0
可用积分
55
专家积分
0
在线时间
1 小时
注册时间
2012-03-22
最后登录
2012-03-31

串门

好友

博客

消息

论坛徽章:
0

10楼[报告]


发表于
2012-03-26 20:20:24 |只看该作者

asuka2001 发表于 2012-03-26 20:10



饿。。。没仔细排版,上面的代码看起有点乱,我缩进代表的是函数调用链:)

亏你发了那么多帖子,你不知道有种排版叫
吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: