linux内核idle进程,动静结合学内核:linux idle进程和init进程浅析

退休的贵族进程 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 ...

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值