《Linux Device Drivers》第二章 构造和运行模块——note

1     代码是一个完整的 "hello world"模块:

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. MODULE_LICENSE("Dual BSD/GPL");
  4.  
  5. static int hello_init(void)
  6. {
  7.     printk(KERN_ALERT "Hello, world\n");
  8.     return 0;
  9. }
  10.  
  11. static void hello_exit(void)
  12. {
  13.     printk(KERN_ALERT "Goodbye, cruel world\n");
  14. }
  15.  
  16. module_init(hello_init);
  17. module_exit(hello_exit);

这个模块定义了两个函数, 一个在模块加载到内核时被调用( hello_init )以及 一个在模块被去除时被调用( hello_exit ). moudle_init 和 module_exit 这几 行使用了特别的内核宏来指出这两个函数的角色. 另一个特别的宏 (MODULE_LICENSE) 是用来告知内核, 该模块带有一个自由的许可证; 没有这样 的说明, 在模块加载时内核会抱怨

2     核心模块与应用程序的基本区别

(1)驱动程序类似事件驱动编程,它初始化时候,注册一些设施,服务于系统调用

(2)应用程序运行在用户空间,驱动程序运行在内核空间

(3)应用程序可使用标准的库函数,而驱动程序连接到内核,只能使用内核导出的符号和函数

(4)应用程序错误,一般只会杀死进程,而驱动程序错误,会造成系统不稳定,或者崩溃

(5)应用程序拥有很大的栈空间,而内核栈很小,一般只有4KB

3     内核中并发的来源

(1)对称多处理器

(2)可延时机制timer、tasklet、workqueue

(3)大多数设备能够中断处理器,而中断处理程序异步运行

4     当前进程

(1)asm.current.h,current

(2)linux/sched.h,struct task_struct

5     一些细节

(1)具有前缀__的函数名称通常是接口的底层组件,应谨慎使用

(2)内核代码不能实现浮点数运算

6     编译和装载模块

(1)/proc/modules

(2)/sys/module

(3)编译模块

 (4)Makefile 

   module-objs :=file1.o file2.o  

   obj-m := module.o

   make -C /usr/src/kernels/2.6.10/ M=`pwd` modules

7 装载和卸载模块

(1)insmod和ld有些类似,将模块的代码和数据装入内核,然后使用内核的符号表解析模块中任何未解析的符号

(2)与链接器不同,内核不会修改模块的磁盘文件,而仅仅修改内存中的副本

(3)依赖定义在kernel/module.c中的一个系统调用

(4)sys_init_module给模块分配内核内存

(5)只有系统调用的名字前带有sys_前缀

(7)modprobe

(8)rmmod

(9)lsmod

(10)lsusb

8     版本依赖

(1)linux/versi(2)linux/module.h

UTS_RELEASE

LINUX_VERSION_CODE

KERNEL_VERSION(major,minor, release)

9     内核符号表

(1) Linux内核头文件提供了一个方便的方法来管理符号对模块外部的可见性,从而减少了可能造成的名字空间污染

(2)EXPORT_SYMBOL(name);

(3)EXPORT_SYMBOL_GPL(name);

10     其他知识

(1)头文件:函数、数据类型和变量的定义

(2)所有模块代码中都包含的代码

                  #include<linux/module.h>

                  #include<linux/init.h>

module.h包含有可装载模块需要的大量符号和函数的定义

init.h的目的是指定初始化和清除函数

内核能够识别的许可证

      • GPL
      • GPL v2
      • GPL and additional rights
      • Dual BSD/GPL
      • Dual MPL/GPL
      • Proprietary

如果一个模块没有地标记为上述内核可识别的许可证,则会被假定是专有的

 (3) 描述性定义

      • MODULE_AUTHOR
      • MODULE_DESCRIPTION
      • MODULE_VERSION
      • MODULE_ALIAS
      • MODULE_DEVICE_TABLE

(4)模块参数

    • moduleparam.h
      • module_param
      • 变量的名称、类型以及用于sysfs入口项的访问许可掩码
    • 内核支持的模块参数类型
      • bool
      • invbool
      • charp
      • int
      • long
      • short
      • uint
      • ulong
      • ushort
    • module_param_array(name, type, num, perm);

猜你喜欢

转载自blog.csdn.net/wxh0000mm/article/details/81706209
今日推荐