免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 776 | 回复: 0
打印 上一主题 下一主题

linux module初步(2) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-07 22:10 |只看该作者 |倒序浏览

               
                /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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP