x86系统初始化:
1 bios系统启动
2 配置A20 段选择子 等配置
3 跳到 start_kernel
start_kernel(init/main.c)分析生成0号进程 1号进程 2号进程功能作用?
0号进程:
struct task_struct init_task = INIT_TASK(init_task);
set_task_stack_end_magic(&init_task);
使用全局变量来设置进程全局环境。
作用:
1 初始化各个模块 (MM/FS/VFS/sched)
2 创建1号进程 2号进程
1号进程 kernel_thread(kernel_init, NULL, CLONE_FS);
2号进程 kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
3 把自己变成idle。(当任务链没有任务,会执行idle进程)
cpu_startup_entry
do_idle();
1号进程 kernel_init:
run_init_process(execute_command);
do_execve
try_to_run_init_process("/sbin/init")
try_to_run_init_process("/etc/init")
try_to_run_init_process("/bin/init")
try_to_run_init_process("/bin/sh")
主要用户加载根文件系统init进程,然后iret到用户态。
是应用层进程祖先进程
2号进程 kthreadd:
管理和调度其他内核线程kernel_thread, 会循环执行一个kthread的函数,
该函数的作用就是运行kthread_create_list全局链表中维护的kthread,
当我们调用kernel_thread创建的内核线程会被加入到此链表中,
因此所有的内核线程都是直接或者间接的以kthreadd为父进程
参考https://blog.csdn.net/21cnbao?type=blog