内核启动过程中init进程和驱动初始化的时间关系

从start_kernel讲起。

start_kernel会打印“Booting kernel”这样的log,这个是我们在内核启动过程中看到的最早的一些log.start_kernel会首先启动内核必要的元素:

setup_arch(&command_line);

page_alloc_init();

mm_init();

ftrace_init();

rcu_init();

early_irq_init();
    init_IRQ();

......

都很重要,就不一一列举了。

驱动和init进程在start_kernel的最后面,rest_init(剩下的,其余的,初始化)

rest_init启动了一个内核线程kernel_init,kernel_init调用kernel_init_freeable-->do_basic_setup();来初始化硬件设备,包括ACPI, PCI, USB等,然后调用run_init_process(ramdisk_execute_command);来启动init进程。

do_basic_setup并不是启动了所有的驱动,我的理解是启动了总线的驱动,挂在在总线上的驱动,比如scsi,input设备,都是在workqueue里启动的,比如drivers/scsi/hosts.c中scsi_host_alloc-->alloc_workqueue-->__alloc_workqueue_key-->init_rescuer中启动了一个rescuer_thread,在该线程中,调用

device_add+0x521/0x670
[    1.466982]  ? __pm_runtime_resume+0x54/0x70
[    1.466984]  scsi_sysfs_add_sdev+0xb8/0x270
[    1.466986]  scsi_probe_and_add_lun+0xc96/0xdb0
[    1.466988]  ? __pm_runtime_resume+0x54/0x70
[    1.466990]  __scsi_add_device+0x11f/0x130
[    1.466993]  ata_scsi_scan_host+0xa0/0x1e0
[    1.466995]  async_run_entry_fn+0x37/0x140
[    1.466997]  process_one_work+0x15e/0x3e0
[    1.466999]  worker_thread+0x4c/0x440
[    1.467001]  kthread+0xf8/0x130
[    1.467003]  ? rescuer_thread+0x350/0x350

对磁盘进行初始化,得到如下log:

[    1.467010] sd 0:0:0:0: Attached scsi generic sg0 type 0
[    1.468207]  sda: sda1 sda2 sda3 sda4
[    1.468414] sd 0:0:0:0: [sda] Attached SCSI disk

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值