----------------------------------------------------------------------------------------------------------------------------------------------------------
本帖翻译了Linux2.6.29的Kobject.txt文档,由于英文水平不好,所以很多地方都翻译不好,之所以还要翻译,就是想逼着自己看,有些东西必须要多看才能有更深的理解。
对于Linux设备驱动模型的学习,打算先强制自己翻译一些基本的内核文档,然后慢慢学习代码。后面也会陆续贴出源码的分析。希望自己能坚持下去,不放弃,呵呵。
欢迎大家批评指正。
----------------------------------------------------------------------------------------------------------------------------------------------------------
驱动模型和建立在kobject之上的抽象之所以难以理解,部分原因在于没有一个明显的入口点。处理kobjects需要理解一些不同的相互之间互相引用的类型。为了使事情变得简单,我们将采用“多遍”的方法,从模糊的概念开始并且逐步添加细节。为了这个目的,在这里给出一些我们将要使用到的一些概念。
l 一个kboject是类型为struct kobject的一个对象
Kobject有一个名字(name)和一个引用计数(reference count)。一个kobject还包含一个父指针(该指针可以使得对象之间可以分层次排列)、一个特殊的类型(即ktype)、一个在sysfs虚拟文件系统里的表示(representation)。
Kobjects基本上并不关注本身,它们通常被嵌入到其他数据结构中,这些数据结构中包含真正受关注的成员。
永远不要让一个数据结构中包含超过1个kobject,如果真的这么做了,那么对该对象的引用计数必定一团糟并且不正确,你的代码也将充满bug,所以千万别这么做。
l 一个ktype是 包含kobject的对象 的类型
每一个包含kobject的结构需要一个对应的ktype。当创建和销毁kobject的时候,ktype控制将会发生什么。
l 一个kset是一组kobjects
这组kobjects可以属于同一ktype,也可以属于不同的ktypes。Kset是收集kobjects的基本的容器类型。Ksets也包含它们自己的kobjects,不过你可以很安全地忽视那些实现细节,因为kset的核心代码会自动地处理它们自己的kobject。
我们将会学习如何创建和操作所有这些类型。我们将采用自底向上的方法,先回到kobjects的学习。
一、嵌入kobjects
内核代码基本上不会创建单独的kobject,但是也有例外(后面解释)。Kobjects被用来控制访问一个更大的、针对特定域的对象。所以,你会发现kobjects常嵌入至其他数据结构中。如果你习惯用面向对象的方式考虑问题,可以认为kobjects是被继承的顶层的抽象基类。Kobject实现了一组操作,这组操作对自身并没有多大的用处,但是对其他对象(包含kobject的对象)来说很有用。C语言并不支持继承关系的直接支持,所以必须使用其他技术—比如嵌入数据结构。举个例子,UIO的代码里有一个数据结构定义了关联到一个uio设备的内存边界:
struct uio_mem
{
struct kobject kobj;
unsigned long addr;
unsigned long size;