1. linux下的C编程特点
if/forwhile/switch语句,“{"不另起一行
if和for只有一行代码,不要使用"{ }";对于函数需要另起一行使用"{ }"。
2. switch case 语句switch 与 case 对齐使用
3. 内核模块的加载,卸载,显示命令
insmod 加载内核模块
rmmod 卸载内核模块
lsmod 显示当前内核模块,对应/pro/modules文件
4. linux内核模块程序结构
⑴模块加载函数(一般需要)
⑵模块卸载函数(一般需要)
⑶模块许可证声明(必须)
⑷模块参数(可选)
⑸模块导出符号(可选)
⑹模块作者等信息声明(可选)
5. 模块加载函数
static int __init initialization_function(void)
{
/*初始化代码*/
}
module_init (initialization_function);
模块的加载必须以module_init(函数名)的形式被指定;
6. 模块卸载函数
static int __exit cleanup_function(void)
{
/*释放代码*/
}
module_exit(cleanup_function);
模块在卸载的时候不返回任何值,必须以module_exit(函数名)的形式来指定。
7. 模块加载和卸载完成的功能
1)若模块加载函数时注册了XXX,则模块卸载函数应该注销XXX。
2)若模块加载函数动态申请了内存,则模块卸载函数应释放该内存。
3)若模块加载函数申请了硬件资源(中断、DMA通道、I/O端口和I/O内存等)的占用,则模块卸载函数应该释放掉这些硬件资源。
4)若模块加载函数开启了硬件,则卸载函数中一般要关闭之。
8. 模块的使用计数
linux 2.4内核中模块在身通过MOD_INC_USE_COUNT、MOD_DEC_USE_COUNT宏来管理自己被使用的次数。
linux 2.6内核提供了管理接口try_module_get(&module)和module_put(&module),取代了2.4内核中的模块使用计数管理宏。
int try_module_get(struct module *module);返回0表示调用失败,
void module_put(struct module *module);用于减少模块的计数。
只有当前设备不再被使用时,模块才允许被卸载。