探究linux设备驱动模型之——platform虚拟总线(一)
说在前面的话 : 设备驱动模型系列的文章主要依据的内核版本是2.6.32的,因为我装的Linux系统差不多就是这个版本的(实际上我用的fedora 14的内核版本是2.6.35.13的。)
今天是今年的第256天,换句话来说,每年的第256天被定为——程序员节。本来我懒得再写东西的了,但是今天好歹是个节日,所以在这时写点东西是有些意义的。
linux设备驱动模型本身就极具复杂性,所以第一次接触这个东西的伙伴们千万不要惊呆、不要气馁。这方面的资料网上还是有很多的,但是真正写的明白的其实很少,因为很多文章的作者自己也是对这个东西理不妥的。所以我们只能在这成堆的资料里面耐心地去寻找正确的指路灯。
还有我打算开始写我的第四本小说了(前三本都太监了),小说的男主决定名为:林纳斯(linux)。仅以此名向我心爱的Linux致敬。这名字虽然听起来比较别扭,不过内涵还是很丰富的(呵呵)。书名初步定为《仙妖记事》。书名随便起的,看着顺眼就行。
言归正传。platform是内核的一个虚拟总线,它不像usb总线、PCI总线那样真实存在的,platform总线完全是虚拟出来的。我们先看看内核是如何定义这个虚拟总线的:
struct bus_type platform_bus_type = {
.name = "platform",
.dev_attrs = platform_dev_attrs,
.match = platform_match,
.uevent = platform_uevent,
.pm = &platform_dev_pm_ops,
};
bus_type是内核的总线结构体,内核所有的总线都是由这个结构体定义的。 我们只关注name和match这两个成员变量,其中name被赋值为"platform",毋庸置疑,这表示定义了一个名为“platform”的总线。match方法在总线、驱动、设备这三者中扮演着十分重要的角色。
在这里我简单说一下match方法何时被调用(理解这一点对于理解整个设备驱动模型起到一定的帮助)。当一个驱动挂接到该总线的时候,该总线的match方法被调用,在这里,platform总线的match方法被赋值为platform_match,也就是说platform_match将被调用,platform_match将会帮驱动找到匹配的设备。同样的,当一个设备挂接到该总线时,platform_match也会被调用,platform_match也会帮该设备找到匹配的驱动。用一句话来说就是,platform_match既帮驱动找对象,也帮设备找对象。当驱动和对象匹配上了,platform_match可是会收两家的媒婆钱,黑心的很。
那么对于platform总线来说,驱动和设备如何挂接到该总线上呢。platform总线分别提供了两个函数给驱动和设备使用。如下所示:
int platform_driver_register(struct platform_driver *drv)
int platform_device_register(struct platform_device *pdev)
很显然platform_driver_register 是给驱动使用的,platform_device_register 是给设备用的。
明天师妹们就来了,可是明天哥居然要去补考专业外语,坑爹啊。
最后再给全世界的程序员们说一句:程序员辛苦了,节日快乐!
待续....
最新文章
- 安装mmseg出错 config.status: error: cannot find input file: src/Makefile.in
- hexo-github 博客搭建
- cookie、session的联系和区别,多台web服务器如何共享session?
- android inflater 用法
- Java中类Exchaner浅析
- [php基础]PHP环境变量$_SERVER和系统常量详细说明
- psycopg2关于undefined symbol: lo_truncate64解决方法
- gdb经常使用命令总结
- git忽略某些文件提交
- Navi.Soft31.产品.登录器(永久免费)
- 小程序代码包压缩 策略&;方案
- nyoj 仿射密码
- Aras简单报表
- storm1.1.0 drpc 部署和调用测试
- C语言#和##操作符使用方法
- sparkStreaming消费kafka-0.8方式:direct方式(存储offset到zookeeper)
- Python 开发
- C 常量的类型
- F题:等差区间(RMQ||线段树)
- python3使用web.py遇到的找不属性的错误解决
热门文章
- SQL修改字段默认值、获取字段默认值
- ";strace -p";非常有用,它减少了很多猜测工作,也不需要重新启动应用。lsof -p process_id +iostat + sar -n DEV 1
- LWIP network interface 网卡 初始化 以 STM32 为例子 后面会有 用 2G 或者4G 模块 用 PPP拨号的 形式 虚拟出网卡 所以先以 这个为 前提
- 怎样卸载wineQQ?
- 依赖项从GIT上拉下来出现黄色三角形解决方法
- iOS开发--MQTT实时处理数据
- c++类模板分文件编写存在的问题
- CentOS7集成Apache和SVN
- html中如何移除video下载按钮
- 运维与架构—Nginx的优缺点