请教几个Linux设备驱动模型的问题
来源:互联网 发布:java iterator 考题 编辑:程序博客网 时间:2024/05/22 15:05
http://bbs.chinaunix.net/thread-3691002-1-1.html
1、Linux设备驱动模型是如何将bus、device和driver关联起来的?它们之间的数据结构关系如何?
2、platform device的设备文件结点是如何注册的?如何与file_operations关联的?
3、sysfs的作用是什么?如何利用它
4、class的作用是什么?内核使用它有什么样的好处?
对Linux设备驱动模型的理解很模糊,一口气提了很多问题。这一部分的内核代码组织比较复杂,如果没有指引,要完全弄明白很不容易。请各位高手指点下,不用回答的很详细,只需要指出内核中的关键代码位置。如果有很好的相关资料也可以提供下,谢谢。
2、platform device的设备文件结点是如何注册的?如何与file_operations关联的?
3、sysfs的作用是什么?如何利用它
4、class的作用是什么?内核使用它有什么样的好处?
对Linux设备驱动模型的理解很模糊,一口气提了很多问题。这一部分的内核代码组织比较复杂,如果没有指引,要完全弄明白很不容易。请各位高手指点下,不用回答的很详细,只需要指出内核中的关键代码位置。如果有很好的相关资料也可以提供下,谢谢。
- 本版精华
- 文库|博客
一列数据存了一组不连续的正整数,求一SQL查 ... | 怎样看某条记录存放在哪个数据块?谢谢 | ora-600错误,急等大牛解决! | 不明白内连接和等值连接有什么区别,貌似一 ...
To be 千里马!
版主
- 帖子
- 14952
- 主题
- 368
- 精华
- 21
- 可用积分
- 11397
- 专家积分
- 79
- 在线时间
- 6431 小时
- 注册时间
- 2007-03-09
- 最后登录
- 2013-01-02
- 论坛徽章:
- 0
回复 1# frank529
第 1 个问题,可以看一下 《深入理解 Linux 网络技术内幕》的相关章节,图文并茂,讲解的很详细。
第 1 个问题,可以看一下 《深入理解 Linux 网络技术内幕》的相关章节,图文并茂,讲解的很详细。
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
白手起家
- 帖子
- 93
- 主题
- 23
- 精华
- 0
- 可用积分
- 159
- 专家积分
- 0
- 在线时间
- 241 小时
- 注册时间
- 2008-05-21
- 最后登录
- 2012-12-07
- 论坛徽章:
- 0
回复 2# Godbach
原来这本书上有讲,回头得好好看看
原来这本书上有讲,回头得好好看看
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
笨鸟须先飞 菜鸟须勤奋
丰衣足食
- 帖子
- 326
- 主题
- 6
- 精华
- 0
- 可用积分
- 652
- 专家积分
- 0
- 在线时间
- 1021 小时
- 注册时间
- 2010-08-11
- 最后登录
- 2012-12-05
- 论坛徽章:
- 0
回复 1# frank529
关键代码就在drivers/base/core.c, drivers/base/driver.c两个里吧;顺着device_register(), driver_register()往下扒拉,可以看清楚整个设备子系统怎么管理设备和驱动的,要下班了,有需要回家再给你拉条线。。。
关键代码就在drivers/base/core.c, drivers/base/driver.c两个里吧;顺着device_register(), driver_register()往下扒拉,可以看清楚整个设备子系统怎么管理设备和驱动的,要下班了,有需要回家再给你拉条线。。。
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
白手起家
- 帖子
- 93
- 主题
- 23
- 精华
- 0
- 可用积分
- 159
- 专家积分
- 0
- 在线时间
- 241 小时
- 注册时间
- 2008-05-21
- 最后登录
- 2012-12-07
- 论坛徽章:
- 0
本帖最后由 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的相关函数随意指定的。
回复 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周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
笨鸟须先飞 菜鸟须勤奋
丰衣足食
- 帖子
- 326
- 主题
- 6
- 精华
- 0
- 可用积分
- 652
- 专家积分
- 0
- 在线时间
- 1021 小时
- 注册时间
- 2010-08-11
- 最后登录
- 2012-12-05
- 论坛徽章:
- 0
回复 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()里再注册另外的字符设备驱动,创建设备节点,这样完成的!
我尝试一个一个回答吧,希望对你有帮助!
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()里再注册另外的字符设备驱动,创建设备节点,这样完成的!
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
笨鸟须先飞 菜鸟须勤奋
丰衣足食
- 帖子
- 326
- 主题
- 6
- 精华
- 0
- 可用积分
- 652
- 专家积分
- 0
- 在线时间
- 1021 小时
- 注册时间
- 2010-08-11
- 最后登录
- 2012-12-05
- 论坛徽章:
- 0
回复 6# frank529
2、关于第二问我只是想拿platform设备举个例子,可能举错了,换个问法:传统的设备驱动需要手动mknod创建设备节点,2.6的设备驱动模型是怎样创建设备节点的呢?比如我用过class的某个注册设备的函数自动生成设备节点(具体函数名忘记了- -)
这个是靠uevent事件完成的,在device_register(), driver_register()里都会调用kobject_uevent()来通知用户空间,然后用户空间应该有个ueventd进程来处理。具体过程我没去仔细研究过。
至于class注册设备来自动生成设备节点,你说的应该是device_create(),只不会其实它也是调用device_register()而已!
2、关于第二问我只是想拿platform设备举个例子,可能举错了,换个问法:传统的设备驱动需要手动mknod创建设备节点,2.6的设备驱动模型是怎样创建设备节点的呢?比如我用过class的某个注册设备的函数自动生成设备节点(具体函数名忘记了- -)
这个是靠uevent事件完成的,在device_register(), driver_register()里都会调用kobject_uevent()来通知用户空间,然后用户空间应该有个ueventd进程来处理。具体过程我没去仔细研究过。
至于class注册设备来自动生成设备节点,你说的应该是device_create(),只不会其实它也是调用device_register()而已!
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
笨鸟须先飞 菜鸟须勤奋
丰衣足食
- 帖子
- 326
- 主题
- 6
- 精华
- 0
- 可用积分
- 652
- 专家积分
- 0
- 在线时间
- 1021 小时
- 注册时间
- 2010-08-11
- 最后登录
- 2012-12-05
- 论坛徽章:
- 0
回复 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)) {
......
没仔细注意是不是列完了,大概的函数调用链应该还是比较清楚了,你可以自己追踪下!
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)) {
......
没仔细注意是不是列完了,大概的函数调用链应该还是比较清楚了,你可以自己追踪下!
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
笨鸟须先飞 菜鸟须勤奋
丰衣足食
- 帖子
- 326
- 主题
- 6
- 精华
- 0
- 可用积分
- 652
- 专家积分
- 0
- 在线时间
- 1021 小时
- 注册时间
- 2010-08-11
- 最后登录
- 2012-12-05
- 论坛徽章:
- 0
饿。。。没仔细排版,上面的代码看起有点乱,我缩进代表的是函数调用链:)
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
白手起家
- 帖子
- 28
- 主题
- 1
- 精华
- 0
- 可用积分
- 55
- 专家积分
- 0
- 在线时间
- 1 小时
- 注册时间
- 2012-03-22
- 最后登录
- 2012-03-31
- 论坛徽章:
- 0
亏你发了那么多帖子,你不知道有种排版叫[code][/code]吗?
- 请教几个Linux设备驱动模型的问题
- 请教高手几个linux的问题
- linux设备驱动中重要的3个数据结构 &&Linux设备驱动模型几个基本数据结构模型:kobject,kset,subsystem
- Linux设备驱动模型
- Linux设备驱动模型
- Linux设备驱动模型
- linux设备驱动模型
- Linux设备驱动模型
- Linux设备驱动模型
- linux设备驱动模型
- linux设备驱动模型
- Linux设备驱动模型
- Linux 设备驱动模型
- Linux设备驱动模型 .
- Linux设备驱动模型
- linux驱动模型 - 设备
- Linux设备驱动模型
- Linux设备驱动模型
- Ubuntu下MPlayer的艰难配置过程
- .net中的对象序列化(1): 序列化是什么, 以及一个简单的例子
- 商店买东西清单显示(46_2)
- 商店买东西清单显示(46_1)
- STL数据结构读书笔记
- 请教几个Linux设备驱动模型的问题
- 对于输入(使用cin)安全性和鲁棒性的小结
- Mybatis 实现物理分页
- 关于XML的一些基础知识
- Java性能优化技巧集锦
- 震精!房妹、其父、其母各有两个身份证,倒卖308套房
- 重装Windows后修复Ubuntu的grub引导
- 如何使用excel计算工龄
- UIWebview 截获html并修改内容。