Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30355
  • 博文数量: 13
  • 博客积分: 570
  • 博客等级: 中士
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-10 08:56
文章分类
文章存档

2008年(13)

我的朋友
最近访客

分类: LINUX

2008-09-17 00:11:15

    Linux设备驱动程序为用户提供了使用系统设备的接口,可以编译为模块,也可以编译到内核源码中。一般情况下,采用编译为内核模块的方式。最简单的Linux设备驱动程序模块分为一下几个部分:

    一:模块入口函数.
    模块入口函数即模块初始化函数,在模块初始化时运行,负责注册模块所提供的,可以被应用程序访问的新功能.
    模块入口函数的原型为: static int __init my_init(void). 其中的几个部分含义如下:
    1.函数为static形式.
    2.返回值为int.
    3.__init表示该函数只在初始化期间使用,模块被装载以后,模块初始化函数即被模块装载器丢弃,这样可以释放该函书使用的内存.
    4.my_init为入口函数的名称,可以任意命名.
    5.void表示入口函数没有参量.

    二: 模块出口函数.
    模块出口函数负责本模块的清理工作,在模块被移除前注销模块接口并向系统返回所有资源,例如函数中动态分配的内存等.
    模块出口函数的原型为: static void __exit my__exit(exit). 其中:
    1.函数为static形式.
    2.函数没有返回值.
    3.__exit的含义与入口函数的__init类似,仅用于模块卸载,如果模块被直接嵌入内核,或者内核配置不允许卸载模块,则该函数被直接抛弃.

    三.出口及入口函数的注册部分.
    模块的出口及入口函数分别使用宏module_init()及module_exit().
    入口函数注册:module_init(my_init),其中my_init为模块入口函数名.
    出口函数注册:module_exit(my_exit),其中my_exit为模块出口函数名.

    四.模块的版权及作者的声明等附加信息.
    该部分使用一系列的宏实现.举例如下:
    指定模块的版权,或使用的许可证:MODULE_LICNSE("GPL"),该声明表示使用了GPL许可证.
    作者的声明:MODULE_AUTHOR("AUTHOR_NAME"),""内部为作者姓名.

    五.模块所需的头文件.
    这也是不可缺少的一部分,最基本的头文件应该包括一下几个:
    #include 模块相关.
    #include 程序调度相关.


    这仅仅是最最简单的设备驱动模块函数,但也是最基本的架构.

阅读(760) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~