从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