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

http://bbs.chinaunix.net/thread-3691002-1-1.html

1、Linux设备驱动模型是如何将bus、device和driver关联起来的?它们之间的数据结构关系如何?
2、platform device的设备文件结点是如何注册的?如何与file_operations关联的?
3、sysfs的作用是什么?如何利用它
4、class的作用是什么?内核使用它有什么样的好处?

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

Rank: 8Rank: 8

帖子
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
---------
明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
 
   

帖子
93
主题
23
精华
0
可用积分
159
专家积分
0
在线时间
241 小时
注册时间
2008-05-21
最后登录
2012-12-07
论坛徽章:
0
3[报告]
  发表于 2012-03-26 17:51:23  | 只看该作者
回复 2# Godbach 


    原来这本书上有讲,回头得好好看看
 
   
笨鸟须先飞 菜鸟须勤奋

Rank: 1

帖子
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的海洋里
 
   

帖子
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的相关函数随意指定的。
 
   
笨鸟须先飞 菜鸟须勤奋

Rank: 1

帖子
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的海洋里
 
   
笨鸟须先飞 菜鸟须勤奋

Rank: 1

帖子
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的海洋里
 
   
笨鸟须先飞 菜鸟须勤奋

Rank: 1

帖子
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的海洋里
 
   
笨鸟须先飞 菜鸟须勤奋

Rank: 1

帖子
326
主题
6
精华
0
可用积分
652
专家积分
0
在线时间
1021 小时
注册时间
2010-08-11
最后登录
2012-12-05
论坛徽章:
0
9[报告]
  发表于 2012-03-26 20:10:49  | 只看该作者
饿。。。没仔细排版,上面的代码看起有点乱,我缩进代表的是函数调用链:)
迷失在Linux的海洋里
 
   

帖子
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 
饿。。。没仔细排版,上面的代码看起有点乱,我缩进代表的是函数调用链:)


亏你发了那么多帖子,你不知道有种排版叫[code][/code]吗?

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值