linux源码分析(三)-start_kernel
2016-10-26 11:01 by 轩脉刃, 196 阅读, 0 评论, 收藏, 编辑前置:这里使用的linux版本是4.8,x86体系。
start_kernel是过了引导阶段,进入到了内核启动阶段的入口。函数在init/main.c中。
set_task_stack_end_magic(&init_task);
这个函数是设置操作系统的第一个进程init。
这个init_task变量是怎么来的呢?从init/init_task.c中初始化的。
struct task_struct init_task = INIT_TASK(init_task);
EXPORT_SYMBOL(init_task);
而这个INIT_TASK的初始化在init/init_task.h:
#define INIT_TASK(tsk) \
{ \
.state = 0, \
.stack = init_stack, \
.usage = ATOMIC_INIT(2), \
.flags = PF_KTHREAD, \
.prio = MAX_PRIO-20, \
.static_prio = MAX_PRIO-20, \
.normal_prio = MAX_PRIO-20, \
...
这里使用的是gcc的结构体初始化方式。http://blog.csdn.net/justlinux2010/article/details/7494754 。这个结构体是根据task_struct结构进行初始化的。
再回到set_task_stack_end_magic
void set_task_stack_end_magic(struct task_struct *tsk) { unsigned long *stackend;
stackend = end_of_st
