免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8379 | 回复: 4
打印 上一主题 下一主题

[硬件及驱动] struct cdev 与struct device [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-04 17:33 |只看该作者 |倒序浏览
          这两天看linux设备模型看得我稀里糊涂了。
在我以前看的资料中,通过inode的成员struct cdev *i_cdev找到字符设备,
字符设备中有struct kobject kobj;struct file_operation *ops;等成员;
file_operation里包含了所有操作文件(这里是设备文件)函数的指针。漏讲了
主设备号和次设备号分别标识驱动程序和设备。感觉条理非常清楚。
       现在来了个linux设备模型。一下子就把我给打晕了,先是
struct cdev 和struct device,这两个数据结构我是认为通过共享相同的kobject来
表示同一个设备,然后前者偏向于驱动程序,后者偏向于设备管理(其实讲到这点我就
已经开始晕头转向了,可能是在胡说八道了)。
      更加重要的是,我在一个源码中已经找不到原来的操作/dev 目录下设备文件的
file_operation数据结构了,只能找到show,store这两个操作属性的函数,属性在sysfs
中表现为文件,你说调个屏幕分辨率,调个音量可以用操作属性文件的方向,那么传输数据
到LCD屏呢?也能用用show store函数?对于进程来说,还是需要用read,write,ioctl函数吧。
还是需要操作 /dev下面的设备文件吧。可是我真的没找在源代码中找到第一段中讲的任何代码。
难道是设备模型帮我们做了这一切,请哪位好心人和我讲解下。
   除非上面的这两个问题,struct device 和struct cdev的区别与联系,以及/dev文件的操
作代码外,还有好多问题,暂时就不贴出来了。估计回答了一两个就能都理解了吧。
   一百万分感谢

论坛徽章:
0
2 [报告]
发表于 2013-06-05 10:10 |只看该作者
struct device 和struct cdev的区别与联系:
我的理解是,Linux设备模型的低级部分(kobject,kset,subsystem)相当于“基类”,sysfs表述是他们的功能之一;Linux设备模型的高级部分(bus,device,device_driver)中,device,cdev是“子类”。net_device中包含了device结构。但是块设备结构gendisk中,我没有找到device或者kobject,只有他们的指针???哎,搞不懂……

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
3 [报告]
发表于 2013-06-05 19:29 |只看该作者
1. bus. device. device_driver:

面向的需求:更倾向于设备“物理”的一面,我们关心设备是通过什么总线连接进系统,怎样进行设备的电源管理,怎么样来处理设备的热插拔,怎么样从用户空间来获取这些信息。这一切的一切,跟设备的功能不相关,你在PCI总线上,我就认为你是PCI设备,管你是网卡还是显卡,还是啥其他的东西。

面向的用户:更多直接和它们打交道的,是内核中的其他子系统,而不是真正的用户空间的程序。一般不同syscall打交道:如各种总线控制器,用户空间完全无法访问,或者向cdev, block_device, net_device提供服务,间接服务于用户空间的程序。


2. cdev, block_device, net_device:

面向的需求:对于用户空间的程序而言,更大程度上期待的是设备的“功能”:我不管你是PCI设备还是USB设备,我只认你是网卡,你就得让我上网;是显卡,就得让我玩3D游戏;是U盘,你就得给我存数据。

面向的用户:毫无疑问,向用户空间的程序提供指定的功能;如 open(), read(), write(), close(), ioctl()或socket(),send(),recv()等。。。一般直接向syscall负责(会通过VFS中转)

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
4 [报告]
发表于 2013-06-05 19:52 |只看该作者
本帖最后由 asuka2001 于 2013-06-05 20:32 编辑

以MTD设备为例吧:

driver/mtdchar.c向用户空间注册设备节点,如/dev/mtd0,提供 struct file_operations mtd_fops。它是cdev,它提供的功能必须依赖于实际的物理设备 device,即 struct mtd_info (mtd_info有成员 struct device dev)。

从/dev/mtd0到struct mtd_info的映射是由设备节点号来完成,内核在mtdchar_open()中调用mtd = get_mtd_device(NULL, devnum);来完成此映射。

mtd_info通过自身的接口,如
struct mtd_info {
....................
        int (*_read) (struct mtd_info *mtd, loff_t from, size_t len,
                      size_t *retlen, u_char *buf);
        int (*_write) (struct mtd_info *mtd, loff_t to, size_t len,
                       size_t *retlen, const u_char *buf);
.....................
}
来实际操作物理设备,假设是nand flash。mtd_info后面又要通过成员变量 priv映射到 struct nand_chip,通过它的成员方法

struct nand_chip {
.........................
        void (*read_buf)(struct mtd_info *mtd, uint8_t *buf, int len);
        void (*erase_cmd)(struct mtd_info *mtd, int page);
        int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip,
                        const uint8_t *buf, int oob_required, int page,
                        int cached, int raw);
.........................
}
来最终将来自用户空间的需求转换为实际的设备操作。

而这些/dev/mtd0 --> mtd_info --> nand_chip映射,是通过注册设备时设定好的。

论坛徽章:
0
5 [报告]
发表于 2013-06-05 22:08 |只看该作者
但是块设备结构gendisk中,我没有找到device或者kobject,只有他们的指针???哎,搞不懂……
gendisk是通用块层的东西,他只用负载从文件系统下发的指令,因此gd->fops = &sd_fops;以scsi设备为例,
scsi_disk->disk = gd;
struct scsi_device
struct scsi_disk
struct gendisk三者的关系你就明白了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP