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