关闭

内核堆栈和用户堆栈

标签: linux内核堆栈
714人阅读 评论(0) 收藏 举报
分类:

内核堆栈和用户堆栈

续上篇《进程上下文和中断上下文》,介绍一下内核堆栈和用户堆栈。

1. linux 0.11系统使用的4种堆栈

Linux0.11系统中共使用了四种堆栈。一种是系统初始化时临时使用的堆栈:一种是供内核程序自己使用的堆栈(内核堆栈),只有一个,位于系统地址空间的固定位置,也是后来任务0的用户态堆栈:另一种是每个任务通过系统调用,执行内核程序时使用的堆栈,我们称之为任务的内核态堆栈,每个任务都有自己独立的内核态堆栈;最后一种是任务在用户态执行的堆栈,位于任务(进程)地址空间的末端。

2. 任务的堆栈

每个任务都有两个堆栈,分别用于用户态和内核态程序的执行,并且分别称为用户态堆栈和内核态堆栈。这两个堆栈之间的主要区别在于任务的内核态堆栈很小,所保存的数据量最多不能超过(4096 - 任务数据结构)个字节,大约为3K字节。而任务的用户态堆栈却可以在用户的64MB空间内延伸。
我理解的内核态堆栈是指,kmalloc申请的堆空间,用户态堆栈是指,malloc申请的堆空间。

3. 内核态与用户态堆栈之间的切换

任务调用系统调用时就会进入内核,执行内核代码。此时内核代码就会使用该任务的内核态堆栈进行操作。当进入内核程序时,由于优先级别发生了改变(从用户态转到内核态),用户态堆栈的堆栈段和堆栈指针以及eflags会被保存在任务的内核态堆栈中。而在执行iret退出内核程序返回到用户程序时,将恢复用户态的堆栈和eflags。
见下图:
内核态和用户态堆栈的切换
另外:
查到,Linux内核的堆栈一般是8K,所以在写内核程序的时候一定要小心,防止函数递归的出现,递归可能导致内核堆栈溢出,还有如果内核态编程,内核堆空间大小8K,如定义数组变量过大,也会崩溃。有待考证。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:65270次
    • 积分:1740
    • 等级:
    • 排名:千里之外
    • 原创:112篇
    • 转载:25篇
    • 译文:0篇
    • 评论:11条