日期:2014-05-16 浏览次数:21426 次
1 代码是一个完整的 "hello world"模块:
这个模块定义了两个函数, 一个在模块加载到内核时被调用( 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的目的是指定初始化和清除函数
内核能够识别的许可证