linux源碼分析(三)-start_kernel
2016-10-26 11:01 by 軒脈刃, 196 閱讀, 0 評論, 收藏, 編輯前置:這里使用的linux版本是4.8,x86體系。
start_kernel是過了引導階段,進入到了內核啟動階段的入口。函數(shù)在init/main.c中。
set_task_stack_end_magic(&init_task);
這個函數(shù)是設置操作系統(tǒng)的第一個進程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 。這個結構體是根據(jù)task_struct結構進行初始化的。
再回到set_task_stack_end_magic
void set_task_stack_end_magic(struct task_struct *tsk) { unsigned long *stackend;
stackend = end_of_st