退休的贵族进程 0号进程所有进程的祖先叫做进程0 在系统初始化阶段由start_kernel()函数从无到有手工创建的一个内核线程 进程0最后的初始化工作创建init内核线程
asmlinkage __visible void __init start_kernel(void)
{
...
//初始化0号进程pcb
set_task_stack_end_magic(&init_task);
...
/* 当只有一个CPU的时候这个函数就什么都不做,,
但是如果有多个CPU的时候那么它就
* 返回在启动的时候的那个CPU的号
*/
smp_setup_processor_id();
...
/* 关闭当前CPU的中断 */
local_irq_disable();
early_boot_irqs_disabled = true;
...
/* 初始化页地址,使用链表将其链接起来 */
page_address_init();
/* 显示内核的版本信息 */
pr_notice("%s", linux_banner);
/*
* 每种体系结构都有自己的setup_arch()函数,是体系结构相关的,具体编译哪个
* 体系结构的setup_arch()函数,由源码树顶层目录下的Makefile中的ARCH变量
* 决定
*/
setup_arch(&command_line);
...
/* 打印Linux启动命令行参数 */
pr_notice("Kernel command line: %s\n", boot_command_line);
/* 对内核选项的两次解析 */
parse_early_param();
after_dashes = parse_args("Booting kernel",
static_command_line, __start___param,
__stop___param - __start___param,
-1, -1, &unknown_bootoption);
if (!IS_ERR_OR_NULL(after_dashes))
parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
set_init_arg);
jump_label_init();
...
/* 初始化hash表,便于从进程的PID获得对应的进程描述符指针 */
pidhash_init();
/* 虚拟文件系统的初始化 */
vfs_caches_init_early();
sort_main_extable();
/*
* trap_init函数完成对系统保留中断向量(异常、非屏蔽中断以及系统调用)
* 的初始化,init_IRQ函数则完成其余中断向量的初始化
*/
trap_init();
mm_init();
/* 进程调度器初始化 */
sched_init();
preempt_disable();
/* 检查中断是否已经打开,如果已经打开,则关闭中断 */
if (WARN(!irqs_disabled(),
"Interrupts were enabled *very* early, fixing it\n"))
local_irq_disable();
...
/* init some links before init_ISA_irqs() */
early_irq_init();
init_IRQ();
tick_init();
rcu_init_nohz();
init_timers();
/* 对高精度时钟进行初始化 */
hrtimers_init();
/* 初始化tasklet_softirq和hi_softirq */
softirq_init();
timekeeping_init();
/* 初始化系统时钟源 */
time_init();
sched_clock_postinit();
perf_event_init();
profile_init();
call_function_init();
WARN(!irqs_disabled(), "Interrupts were enabled early\n");
early_boot_irqs_disabled = false;
local_irq_enable();
/* slab初始化 */
kmem_cache_init_late();
/*
* 初始化控制台以显示printk的内容,在此之前调用的printk
* 只是把数据存到缓冲区里
*/
console_init();
if (panic_later)
panic("Too many boot %s vars at `%s'", panic_later,
panic_param);
lockdep_info();
...
/*
* CPU性能测试函数,可以计
算出CPU在1s内执行了多少次一个
* 极短的循环,计算出来的值经过处理后得
到BogoMIPS值(Bogo是Bogus的意思),
*/
calibrate_delay();
pidmap_init();
...
/* 创建init进程 */
rest_init();//66 analysis 0 #, never return ...
}