1. 編譯kernel
編譯linux時其實會又很多產物,因為android讓我接觸了linux 內核的一些資料。
貼最后一段make的Log
$ make ARCH=arm CROSS_COMPILE=/dev/.....
... < many build steps omitted for clarity>
LD vmlinux Kernel proper,EFL format,最原始的kernel
SYSMAP System.map
OBJCOPY arch/arm/boot/Image 去掉 symbols, notes, and comments.
Kernel: arch/arm/boot/Image is ready objcopy to generate a binary file, Image
AS arch/arm/boot/compressed/head.o ARM-specific startup code generic to ARM processors,與arm相關的一些重要的啟動時要用
GZIP arch/arm/boot/compressed/piggy.gz gzip打包
AS arch/arm/boot/compressed/piggy.o 加載piggy.S,initializes the processor,required memory regions
CC arch/arm/boot/compressed/misc.o Routines used for decompressing the kernel image
AS arch/arm/boot/compressed/head-xscale.o
AS arch/arm/boot/compressed/big-endian.o
LD arch/arm/boot/compressed/vmlinux 這容易搞亂,這個vmlinux和第一個Kernel proper是不一樣的。
OBJCOPY arch/arm/boot/zImage Final composite kernel image,loaded by bootload.
Kernel: arch/arm/boot/zImage is ready
boot-strap Loader :misc.o head-xscale.o big-endian.o
2. Initialization
Power on-> bootloader ->head-xscale.o(boot-strap )-> head.o(vmlinux)->main.o(kernel)
3. start_kernel();
啟動Init()process.init初始化之前注冊的函數,最后釋放資源。內核級別啟動常報的錯就是“No init found. Try passing init= option to kernel”
這主要是因為通過run_init_process執行系統級別的/init時失敗,返回。如果成功,該函數不會返回。
if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING "Failed to execute %s. Attempting "
"defaults...\n", execute_command);
}
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
panic("No init found. Try passing init= option to kernel.");
PS:
start_kernel(): .../init/main.c Most of the Linux kernel initialization takes place in this routine
setup_arch(&command_line):
start_kernel() function is the call to
setup_arch(), .../arch/arm/kernel/setup.c