描述任务0的内核堆栈和用户堆栈是如何产生的:
1,
linux0.11系统共使用了4种堆栈:系统初始化时临时使用的堆栈;供内核程序自己使用的堆栈(内核堆栈),只有一个,位于系统
地址空间固定的位置,也就是后来任务0的用户态堆栈;每个任务通过系统调用,执行内核程序时使用的堆栈,也即任务的内核态
堆栈,每个任务都有自己独立的内核态堆栈;任务在用户态执行的堆栈,位于任务(进程)地址空间末端,即任务的用户态堆栈
2,
从head.s程序起,系统正式在保护模式下运行,此时堆栈段被设置为内核数据段(0x10),堆栈指针esp设置成指向use_stack
数组的顶端,保留1页内存作为堆栈使用。head.s L23:lss _stack_start,%esp,_stack_start为指向结构体变量stack_
start的指针。
stack_start定义在sched.c L69 ~ L72:
struct { long * a; short b; } stack_start = { & user_stack [PAGE_SIZE>>2] , 0x10 };
故lss _stack_start,%esp的作用:0x10 -> ss,& user_stack [PAGE_SIZE>>2] -> esp。
head.s中执行完下列指令: L18 ~ L23
movl $0x10,