linux源碼分析(三)-start_kernel

2016-10-26 11:01 by 軒脈刃, 196 閱讀, 0 評論, 收藏編輯

前置:這里使用的linux版本是4.8,x86體系。

start_kernel是過了引導階段,進入到了內(nèi)核啟動階段的入口。函數(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的結(jié)構(gòu)體初始化方式。http://blog.csdn.net/justlinux2010/article/details/7494754 。這個結(jié)構(gòu)體是根據(jù)task_struct結(jié)構(gòu)進行初始化的。

再回到set_task_stack_end_magic

void set_task_stack_end_magic(struct task_struct *tsk) { unsigned long *stackend;

    stackend = end_of_st
        
		

網(wǎng)友評論