2.3 核心模块和应用程序的对比

本文探讨了内核模块与应用程序在资源管理、可调用函数、并发性和栈空间方面的区别。内核模块需要手动释放资源,仅能使用内核导出的函数,并且必须是可重入的,以应对多进程和多CPU环境。此外,内核栈空间有限,大型变量应动态分配。同时,文章提到了`current`宏在内核中表示当前进程/线程控制块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、内核模块和应用程序的区别

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值