字符型设备struct cdev结构体问题
struct cdev {
struct kobject kobj; // 每个 cdev 都是一个 kobject
struct module *owner; // 指向实现驱动的模块
const struct file_operations *ops; // 操纵这个字符设备文件的方法
struct list_head list; // 与 cdev 对应的字符设备文件的 inode->i_devices 的链表头
dev_t dev; // 起始设备编号
unsigned int count; // 设备范围号大小
};
这个结构体里的 struct module *owner; 元素干嘛用的呢?
在什么时候设备会调用这个变量呢?
[解决办法]
在驱动的file_operations中,有.owner = THIS_MODULE。宏THIS_MODULE,它的定义如下是#define THIS_MODULE (&__this_module),__this_module是一个struct module变量,代表当前模块,跟current有几分相似。可以通过THIS_MODULE宏来引用模块的struct module结构。
[解决办法]
你考虑下实现。比如,你写了个字符型设备驱动,他是一个module,可以动态的被link和unlink。
当你用到cdev(代表一个字符设备)来进行一些操作时,你如何知道应该对哪个module进行操作呢?
于是就有了cdev结构中的module这个域,用以指明此结构需要操作的module。
内核虽然是用c写的,但是却是各种OO思想。
以上这种技巧在内核中很普遍。