一、内核模块和应用程序的区别
1、资源申请与释放
- 应用程序在退出时,不释放资源会由os释放
但是内核模块在退出时,一定要手动释放自己申请的资源。
2、能调用的函数
- 内核模块不会链接任何函数库,因此只能用内核导出的公用符号。
3、并发性相关
- 驱动模块要求是可重入的,要求能够运行在多个上下文中。
原因:
1、一个驱动模块可能同时被多个进程使用。
2、linux支持多处理器系统,一个驱动程序可能同时在多个cpu上运行。
4、栈
-
栈,主要用来保存函数调用历史(便于返回);
当前活动函数中的自动变量中。 -
应用程序运行在虚拟地址,其栈空间很大。
内核的栈空间很小,我们编写的内核模块函数,要和整个内核空间调用链共享同一个栈空间。
因此,size大的变量不要放在栈里,而是在调用时动态分配内存。
二、其他细节
- 内核中,current 是一个宏,表示当前的进程/线程控制块
// current.h
DECLARE_PER_CPU(struct task_struct *, current_task);
static __always_inline struct task_struct *get_current(void)
{
return this_cpu_read_stable(current_task);
}
#define current get_current()