Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9145456
  • 博文数量: 1725
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 19840
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1725)

文章存档

2024年(1)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: LINUX

2010-10-15 15:23:13

  • #include  //moudle.h 包含了大量加载模块需要的函数和符号的定义
    #include //init.h 指定你的初始化和清理函数
  • MODULE_LICENSE("GPL");使用的代码许可证
    • 内核认识的特定许可有, "GPL" "GPL v2" "Dual BSD/GPL", "Dual MPL/GPL", 和 "Proprietary".
  • MODULE_AUTHOR ( 声明谁编写了模块 )
  • MODULE_DESCRIPION( 关于模块做什么的声明 )
  • MODULE_VERSION ( 代码修订版本号)
  • MODULE_ALIAS ( 模块为人所知的另一个名子 )
  • MODULE_DEVICE_TABLE ( 来告知用户空间, 模块支持那些设备 ).
  • 各种 MODULE_ 声明的惯例未放在文件末尾。

  • 模块初始化函数注册模块提供的任何功能。
    static int __init initialization_function(void)
    {
    
     /* Initialization code here */
    }
    module_init(initialization_function);
    
    __init 标志告诉内核,这个函数知识在初始化使用,模块初始化完成后内核丢弃此函数,并会自动回收本函数的内存。
    __initdata 标志给只在初始化时用的数据。
    __devinit 和 __devinitdata: 在内核没有配置支持hotplug设备时转化成_init和_initdata.
    返回值 err 是一个错误码. 在 Linux 内核里, 错误码是负数, 属于定义于 的集合。
  • 清理函数: 注销接口, 在模块被去除之前返回所有资源给系统
    static void __exit cleanup_function(void)
    {
     /* Cleanup code here */
    }
    
    module_exit(cleanup_function);
    
    __exit 修饰符标识这个代码是只用于模块卸载( 编译器会把它放在特殊的 ELF 段)
    模块清理函数必须撤销任何由初始化函数进行的注册, 并且惯例(但常常不是要求的)是按照注册时相反的顺序注销设施.
  • 初始化中的错误处理

    • 模块代码必须一直检查返回值, 并且确认要求的操作实际上已经成功.
    • 错误恢复有时用 goto 语句处理是最好的.
  • 模块参数

    • 参数的值可由 insmod 或者 modprobe 在加载时指定; 后者也可以从它的配置文件(/etc/modprobe.conf)读取参数的值.
    • 模块参数支持许多类型:
      • bool
      • invbool

        一个布尔型( true 或者 false)值(相关的变量应当是 int 类型). invbool 类型颠倒了值, 所以真值变成 false, 反之亦然.



        charp

        一个字符串指针值.

        int / long / short / uint / ulong / ushort

        数组参数, 用逗号间隔的列表提供的值, 模块加载者也支持. 声明一个数组参数, 使用: module_param_array(name,type,num,perm);
        这里 name 是你的数组的名子(也是参数名), type 是数组元素的类型, num 是一个整型变量, perm 是通常的权限值. 如果数组参数在加载时设置, num 被设置成提供的数的个数. 模块加载者拒绝比数组能放下的多的值.

    • 权限值:
      • 这个值控制谁可以存取这些模块参数在 sysfs 中的表示
      • perm 被设为 0, 就根本没有 sysfs 项, 否则参数出现在 /sys/module[] 下面, 带有给定的权限。
      • S_IRUGO 作为参数可以被所有人读取, 但是不能改变
      • S_IRUGO|S_IWUSR 允许 root 来改变参数.
      • 注意, 如果一个参数被 sysfs 修改, 你的模块看到的参数值也改变了, 但是你的模块没有任何其他的通知. 你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应.
阅读(1270) | 评论(0) | 转发(0) |
0

上一篇:2.4. 编译和加载

下一篇:2.10. 快速参考

给主人留下些什么吧!~~