初始化过程中的内核栈

初始化过程中的内核栈

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内核设计的艺术