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 千里马!
帖子
-
14952
主题
-
368
精华
-
21
可用积分
-
11397
专家积分
-
79
在线时间
-
6431 小时
注册时间
-
2007-03-09
最后登录
-
2013-01-02
论坛徽章:
-
0
|
回复 1# frank529 第 1 个问题,可以看一下 《深入理解 Linux 网络技术内幕》的相关章节,图文并茂,讲解的很详细。 |
|
----------
欢迎光临Godbach的博客交流技术问题:
Godbach's Blog
---------
明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
|
|
|
| |
帖子
-
93
主题
-
23
精华
-
0
可用积分
-
159
专家积分
-
0
在线时间
-
241 小时
注册时间
-
2008-05-21
最后登录
-
2012-12-07
论坛徽章:
-
0
|
回复 2# Godbach 原来这本书上有讲,回头得好好看看 |
|
|
|
|
| |
笨鸟须先飞 菜鸟须勤奋
帖子
-
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()往下扒拉,可以看清楚整个设备子系统怎么管理设备和驱动的,要下班了,有需要回家再给你拉条线。。。 |
|
迷失在Linux的海洋里
|
|
|
| |
帖子
-
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的相关函数随意指定的。 |
|
|
|
|
| |
笨鸟须先飞 菜鸟须勤奋
帖子
-
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()里再注册另外的字符设备驱动,创建设备节点,这样完成的! |
|
迷失在Linux的海洋里
|
|
|
| |
笨鸟须先飞 菜鸟须勤奋
帖子
-
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()而已! |
|
迷失在Linux的海洋里
|
|
|
| |
笨鸟须先飞 菜鸟须勤奋
帖子
-
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)) { ...... 没仔细注意是不是列完了,大概的函数调用链应该还是比较清楚了,你可以自己追踪下! |
|
迷失在Linux的海洋里
|
|
|
| |
笨鸟须先飞 菜鸟须勤奋
帖子
-
326
主题
-
6
精华
-
0
可用积分
-
652
专家积分
-
0
在线时间
-
1021 小时
注册时间
-
2010-08-11
最后登录
-
2012-12-05
论坛徽章:
-
0
|
饿。。。没仔细排版,上面的代码看起有点乱,我缩进代表的是函数调用链:) |
|
迷失在Linux的海洋里
|
|
|
| |
帖子
-
28
主题
-
1
精华
-
0
可用积分
-
55
专家积分
-
0
在线时间
-
1 小时
注册时间
-
2012-03-22
最后登录
-
2012-03-31
论坛徽章:
-
0
|
asuka2001 发表于 2012-03-26 20:10
饿。。。没仔细排版,上面的代码看起有点乱,我缩进代表的是函数调用链:)
亏你发了那么多帖子,你不知道有种排版叫[code][/code]吗? |
|