您的位置:首页 > 运维架构 > Linux

linux从上电到到启动流程简要过程以及关键函数

2016-04-04 12:33 513 查看
linux 4.1.x

ARM上电。执行BOOTLOADER

bootloader加载kernel 。传递参数给kernel 然后执行kernel

设置一些寄存器,初始化一些状态等等。然后跳到head.s执行

head.s已经属于kernel的部分了

head.s主要是硬件相关的部分,解压kernel等等。最终跳转到

start_kernel里面执行

start_kernel 依旧需要很多初始化 pid 中断等等

这些基本完成后调用rest_init

static noinline void __init_refok rest_init(void)

{

       ..............................

kernel_thread(kernel_init, NULL, CLONE_FS);
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);

cpu_startup_entry(CPUHP_ONLINE);

}

cpu_startup_entry 调用cpu_idle_loop

void cpu_startup_entry(enum cpuhp_state state)

{
cpu_idle_loop();

}

cpu_idle_loop 是一个死循环 idle进程是0号进程。当CPU没有任何事情可以做的时候就进入了Idle进程。

static void cpu_idle_loop(void)

{
while (1)
{

xx
}

}

所以后续的事情其实主要是

kernel_thread(kernel_init, NULL, CLONE_FS);   

pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);

也就是创建两个进程

第二个 kthreadd主要是调度其他的线程。

idle进程Pid=0

kernel_init 进程Pid=1

kthreadd 进程pid=2

所以最关键的就是kernel_init函数了(之前vfs_cache 以及后续的操作 什么的已经将文件系统建立起来了)

kernel_init 主要是执行一个特定的进程任务。

只要由一个任务执行成功就返回。否则一直try 到最后一个。如果还是执行失败,那么系统起不来

执行顺序是

1 传递给内核的参数 init=xxxxxxxxx

ramdisk_execute_command

2传递给内核的参数 rdinit=xxxxxxxxxxxx

execute_command

 3 /sbin/init

4 /etc/init

5 /bin/init

有一个启动成功就返回。全部失败。系统启动失败panic
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: