- 论坛徽章:
- 0
|
/proc/kallsyms中保存了内核所使用的全部全局符号。
主设备号表示设备的控制器,从设备号表示设备。
所有的主设备号都保存在/usr/src/linux/Documentation/devices.txt中。
所有的设备都要有一个设备号。可以使用mknod来创建一个有主设备号和次设备号的节点。
内核只需要知道主设备号来寻址控制器。控制器才关心次设备号。
结构体file_operations定义在linux/fs.h中,其中包含这各种对设备操作的函数的指针。
每个设备都由file结构体来表示,也定义在linux/fs.h中。
两种不同的file_operations赋值方式
struct file_operations fops = {
read: device_read,
write: device_write,
open: device_open,
release: device_release
};
struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
};
所有的设备基本上都在/dev文件夹下面。要注册一个字符设备使用函数:
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
参数一次是设备的主设备号、设备名、设备的操作。返回负值表示注册失败。正值表示设备的主设备号。
这个函数在头文件 linux/fs.h中声明.
不要随便自己给定一个主设备号。最好是将major赋值为0,让内核自动的分配一个主设备号。新注册的设备在 /proc/devices中有一个入口。
有一个计数器用来跟踪设备被调用了多少次。不需要在 cleanup_module()中检测这个计数器,因为定义在 linux/module.c中的 sys_delete_module()函数会检查但是不能直接对这个计数器进行操作,而需要使用宏:
try_module_get(THIS_MODULE): Increment the use count.
一般在open函数中使用。
module_put(THIS_MODULE): Decrement the use count
一般在close或者release函数中使用。
但还是应该自己再定义一个变量来记录设备打开的次数。好让自己知道打开的次数。
要让自己编写的module能用于多个版本的内核,最好的办法就是区分出内核的版本。比较宏 LINUX_VERSION_CODE和宏 KERNEL_VERSION即可。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/69984/showart_1921770.html |
|