深入探究线程栈:从内核到用户空间的全面解析
1. 线程栈的基本概念
在操作系统中,每个用户模式线程都拥有两个栈:用户模式栈和内核模式栈。不过,内核线程是个例外,它们仅具备内核模式栈,因为内核线程没有用户映射,也就不存在用户空间段。
每个内核线程在创建时都会分配一个任务结构和一个内核模式栈。内核模式栈在很多方面与用户模式栈类似:每次在内核空间调用函数时,都会设置一个栈帧(栈帧布局取决于具体的架构,是 CPU ABI 文档的一部分)。CPU 有一个寄存器来跟踪栈的当前位置(通常称为栈指针 SP),并且栈会向较低的虚拟地址“增长”。但与动态的用户模式栈不同,内核模式栈的大小是固定且较小的。
为了在编译时提醒开发者内核栈使用过高的情况,存在一个内核可配置项(CONFIG_FRAME_WARN)。以下是 lib/Kconfig.debug 文件中的相关文本:
config FRAME_WARN:
int "Warn for stack frames larger than"
range 0 8192
[…]
default 2048 if 64BIT
help
Tell gcc to warn at build time for stack frames larger than this.
Setting this too low will cause a lot of warnings.
Setting it to 0 disables the warning.
超级会员免费看
订阅专栏 解锁全文


被折叠的 条评论
为什么被折叠?



