现在的位置: 首页 > 综合 > 正文

linux 设备模型简析

2013年08月23日 ⁄ 综合 ⁄ 共 2213字 ⁄ 字号 评论关闭

 

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设备模型的简单认识。如有错误之处,希望大家帮忙指出。

抱歉!评论已关闭.