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
        
		

网友评论