Linux设备模型
看LDD3中设备模型一章,觉得思维有些混乱。这里从整体的角度来理理思路。
本文从四个方面来总结一些内容:
1.底层数据结构:kobject,kset.
2.linux设备模型层次关系:bus_type,device,device_driver.
3.集成:PCI设备驱动模型实例及设备,设备驱动注册源码的简单分析.
4.面向对象的思想在linux设备模型中的应用分析.
一、底层数据结构:kobject,kset
先说说模型的意义:
总体来说是为了系统地管理所有设备。
kobject
结合面向对象的思维。这个kobject属于最基础的结构,也就是最高抽象层(有点像java中的Cobject类)。任何一个设备模型如总线,设备,驱动都属于一个kobject 。在实现上这种派生关系就是在结构体中包含一个kobject的变量。
这个在层次上处理最顶层的kobject结构提供了所有模型需要的最基本的功能:
1 引用计数 用于内核维护其存在与消亡
2 sysfs表示 每个sys/下的对象对应着一个kobject。
3 热拔插事件处理。 处理设备的热拔插事件。
Kobjects 在内核中对应有一套申请,初始化,添加,注册,计数操作,释放等函数
struct kobject {
const char * k_name; 名
char name[KOBJ_NAME_LEN];
struct kref kref; 计数
struct list_head entry; 用于连接到同类kobjects的链表
struct kobject * parent; 用于实现层次,指向其父对象。
struct kset * kset; 用于实现层次,所属的集合
struct kobj_type * ktype; 指向对象的类型。
struct dentry * dentry; 指示在sysfs 中的目录项
wait_queue_head_t poll;
}; (linux 2.6.18)
Kset 和kobj_type struct kset {
struct subsystem * subsys; 在最新内核中已经没有subsys概念了。统一用ksets
struct kobj_type * ktype; 类型。
struct list_head list; 同一kset的链表
spinlock_t list_lock;
struct kobject kobj; 自身
相关文档:
2.1.2 是否通用
有些单片机厂家也给客户提供了大量的驱动程序,比如USB
HOST驱动程序,这可以让客户很容易就可以在它的上面编写程序读写U盘。但是客户写的这些程序,只能在这种芯片、这个驱动程序上使用;更换另一种芯片
后,即使芯片公司也提供了驱动程序,但是接口绝对不一样,客户又得重新编写应用程序。
基于操作 ......
由于32位操作系统下面单进程最大内存使用不能超过2G,而我们用Memcached经常需要使用更大的内存空间,所以选择64位的Linux版本是必须的,64位OS下的Memcached安装和32位OS下差不多,只有一个地方稍有不同,详见下面的红色字体部分。
我们以版本memcached-1.2.6为例,对于其他版本替换相应版本号即可;
下载地址:http://w ......
STAT(该行程的状态)
D: 不可用信号中断的睡眠状态
R: 正在执行或处于执行队列中
S: 可以用信号中断的睡眠状态
T: 暂停执行
Z: 僵死状态
------------------------------------
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程&nbs ......
STAT(该行程的状态)
D: 不可用信号中断的睡眠状态
R: 正在执行或处于执行队列中
S: 可以用信号中断的睡眠状态
T: 暂停执行
Z: 僵死状态
------------------------------------
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程&nbs ......