请教几个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设备驱动模型的理解很模糊,一口气提了很多问题。这一部分的内核代码组织比较复杂,如果没有指引,要完全弄明白很不容易。请各位高手指点下,不用回答的很详细,只需要指出内核中的关键代码位置。如果有很好的相关资料也可以提供下,谢谢。
  • 本版精华
  • 文库|博客
  • 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 千里马!

版主

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

丰衣足食

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

丰衣足食

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的海洋里
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
 
  
asuka2001
笨鸟须先飞 菜鸟须勤奋

丰衣足食

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的海洋里
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
 
  
asuka2001
笨鸟须先飞 菜鸟须勤奋

丰衣足食

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的海洋里
MySQL每周一议话题有奖征集| ChinaUnix社区11周年庆典寄语 | 华为云服务器有奖调查!双重大礼等您拿! | 参与安全技术讨论赢最新图书!
 
  
asuka2001
笨鸟须先飞 菜鸟须勤奋

丰衣足食

Rank: 1

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


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