Content #
代码路径:linux/kernel/sched.c
long user_stack [ PAGE_SIZE>>2 ];
struct {
long * a;
short b;
} stack_start = {&user_stack[PAGE_SIZE>>2], 0x10};
定义用户堆栈,共1K项,容量4K。注意,esp指在user_stack数组最后一项的后面,这是因为Intel CPU总是先递减栈指针,然后再入栈。
在内核初始化过程中用作内核栈:代码路径:boot/head.s
内核初始化完成后,它被用作任务0的用户态堆栈。参看 进程0由0特权级翻转到3特权级。
初始化过程中的内核栈与任务的内核态栈并不是同一块内存。进程0在执行时用的是user_stack指向的栈,只有在切换到进程1以后,才开始使用每个任务自备的内核栈。
From #
Linux内核设计的艺术