file_operations 不可能被抛弃。它是字符设备的基础结构,
各种设备模型或者说总线,只是对字符设备进行了包装。
驱动一定是内核模块 内核模块不一定是驱动
设备模型的初衷 是省电 建立一条 挂有 所有设备的树 全局设备树
与用户空间的通信:设备间的通信 都是通过 sysfs文件系统实现的 把设备模型的接口以文件的形式 暴露给用户
可以通过 读写文件的方式 配置设备
设备模型的经济基础决定了设备模型的上层建筑
kobject是构成设备模型的最小单元 是构成设备模型的核心结构 把一些 不同设备通用的东西属性或操作放到一个结构里 便于管理 。 kobject 相当于面向对象的基类 。 把 kobject 嵌入到更大的对象中 。 这些对象通过 kobject 联接起来形成了一个树状结构,便于管理 。 kobject_type 是具有相同操作的 kobject 结构的集合。
它管理一类 kobject 在sysfs下的操作 。 kset是 kobject 的集合 。 kobject 通过kset形成层次化的集合kobject 相当于一个叶子节点 。 kobject和kset二者连接形成一个树状结构 kobject_type关心 kobject的类型。 kset关心的是kobject的集合 。 kset是kobject的顶层容器类 。 只要设置了一个kset 并在系统中注册,则将在sysfs文件系统中添加一个目录 kset建立上层下层的关联性 kobject通过kset来分辨自己属于哪个类型 。 从而可在sysfs文件系统下确立自己正确的目录位置,kobject会利用自kobject_type 己结构中的kset来确定自己所属的kset 并把kobject 中的kobject_type 字段指向对应所属kset中的kobject_type 。 设备模型中 所有的设备都通过 总线连接 驱动就是内核和设备通信的软件程序。
当我们说设备驱动的时候,应该说是某个总线下的设备和驱动(例如:usb下的网卡驱动还是PCI总线下的网卡驱动)
device_driver结构往往嵌入到更大的结构中 如platform_driver中 总线设备驱动 是完美三角关系 两两互相包含 总线设备驱动 是现货存在的对象 kobject 是他们的基类实现的是一些功能和接口
kset 是用链表来实现的
usb_register 把device——driver这个结构插入到usb bus——type中的驱动链表中 match函数为 device 和 driver搭桥
spec 协议规范
static struct platform_driver s3c2412fb_driver = {
.probe = s3c2412fb_probe,
.remove = s3c2410fb_remove,
.suspend = s3c2410fb_suspend,
.resume = s3c2410fb_resume,
.driver = {
.name = "s3c2412-lcd",//name字段 定义了后 会在/sys/bus/platform/devices/目录下生成相应名字的链接 源文件在devices/platform/s3c2410-lcd目录下
.owner = THIS_MODULE,
},
};
struct bus_type platform_bus_type = {
.name = "platform",
.dev_attrs = platform_dev_attrs,
.match = platform_match,
.uevent = platform_uevent,
.pm = PLATFORM_PM_OPS_PTR,
};
platform_driver_register(struct platform_driver *drv) 函数注册 就是填写
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*suspend_late)(struct platform_device *, pm_message_t state);
int (*resume_early)(struct platform_device *);
int (*resume)(struct platform_device *);
struct device_driver driver;
};结构
并将struct platform_driver 挂到
bus上挂了两个链表,一个是driver,一个devices,注册devices时,会把该device挂到devices链表上,同时会遍历driver链表,寻找可以驱动该device的driver,如果有则调用驱动中的probe函数,设备就驱动上了;
同样的过程发生在注册驱动的情况下
任何设备模型 例如各种最终封装的是字符设备即file_opration结构体 总线设备驱动 作为一个大的框架包装了它 ,形成一个对象
以上是我对linux设备模型的简单认识。如有错误之处,希望大家帮忙指出。