第一遍看书时不明白,今天偶然又看到了这一点,顿时豁然开朗
linux0.12系统中共用了四种堆栈
1. 系统引导初始化时临时使用的堆栈,此时我的理解是系统还在实模式
2. 进入保护模式之后提供内核程序初始化使用的堆栈,位于内核代码地址空间固定位置处,该堆栈也是后来任务0的用户态堆栈,个人理解任务0比较特殊,它的内核态堆栈还是用户
态堆栈都在内核中。
3. 每个任务通过系统调用,执行内核程序时使用的堆栈,我们称之为任务的内核态堆栈,每个人物都有自己的内核态堆栈,内核态堆栈是和任务数据结构一起定义
4.任务在用户态执行的堆栈,位于任务逻辑地址空间的末端处。
以前有一段时间还怀疑过linux0.12中内核态堆栈和内核堆栈是不是一个东西,现在我可以很自信的说,这两个是一个东西。
下面说下任务的堆栈,说的都是在linux0.12中的情况
每个任务(除了任务0和任务1)有自己的64M地址空间,当一个任务刚被创建时,它的用户态堆栈指针被设置在起地址空间的靠近末端(64M顶端)部分。实际上末端部分还要包括执
行程序的参数和环境变量,然后才是用户的堆栈空间。说到这里的参数和环境变量联想《自己动手写操作系统》和《程序员的自我修养》c语言mian函数的执行可看出,main函数
再被调用钱,堆栈上已经压入了main函数的参数。P181
每个任务的内核态堆栈的初始化为
p->tss.esp0=PAGE_SIZE+(long)p;
p->tss.ss0=0x10;
可见每个任务(任务0和任务1除外)的内核态堆栈是都是用的同一块地址空间,所以应该不支持内核级的中断。