核心啟動過程中init程序和驅動初始化的時間關係

2021-10-23 12:20:58 字數 1552 閱讀 2640

從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

linux核心啟動過程中 set

set up是乙個巨集 define setup str,fn setup param str,fn,fn,0 define setup param str,unique id,fn,early static char setup str unique id initdata str static ...

壓縮核心zImage的啟動過程中的引數

text 段開始,先是核心解壓位址的確定 text ifdef config auto zreladdr determine final kernel image address movr4,pc and r4,r4,0xf8000000 add r4,r4,text offset else ldr...

關於android啟動過程中logo

android開機啟動會有3個logo出現 1.bootable啟動,出現android機械人影象 修改目標 用自定義的ppm替代 drivers video logo logo linux clut224.ppm,同時刪除logo linux clut224.c logo linux clut22...