歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 被忽視的另一個vmlinux

被忽視的另一個vmlinux

日期:2017/2/28 13:48:16   编辑:Linux教程

在x86平台,編譯完內核後用find命令搜vmlinux,你可以看到有兩個同名的文件。

./vmlinux
./arch/x86/boot/compressed/vmlinux

當我第一次見到的時候,也是有點吃驚的。要不是這麼多年在江湖行走,也不會這麼淡定。

誰會用到他

其實之前我們就見到過了,不過當時並沒有仔細去研究。

"arch/x86/boot/Makefile"

$(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/tools/build FORCE
    $(call if_changed,image)
    @echo 'Kernel: $@ is ready' ' (#'`cat .version`')'

OBJCOPYFLAGS_vmlinux.bin := -O binary -R .note -R .comment -S
$(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
    $(call if_changed,objcopy)

恩,這個就是制作bzImage的第二個部分。

他怎麼來的

"arch/x86/boot/compressed/Makefile"

$(obj)/vmlinux: $(vmlinux-objs-y) FORCE
    $(call if_changed,ld)
    @:

簡單明了,就是一堆obj鏈接而成。

都包含了誰

"arch/x86/boot/compressed/Makefile"

vmlinux-objs-y := $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \
    $(obj)/string.o $(obj)/cmdline.o \
    $(obj)/piggy.o $(obj)/cpuflags.o

vmlinux-objs-$(CONFIG_EARLY_PRINTK) += $(obj)/early_serial_console.o
vmlinux-objs-$(CONFIG_RANDOMIZE_BASE) += $(obj)/aslr.o

$(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone

vmlinux-objs-$(CONFIG_EFI_STUB) += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o \
    $(objtree)/drivers/firmware/efi/libstub/lib.a
vmlinux-objs-$(CONFIG_EFI_MIXED) += $(obj)/efi_thunk_$(BITS).o

恩,這個問題解決了,不過別的困惑又來了。

bzImage中包含的是這個vmlinux,那根目錄的vmlinux呢?啟動的時候是怎麼把根目錄的vmlinux加載到內存的? 又是怎麼跳轉到根目錄的vmlinux的呢?

Copyright © Linux教程網 All Rights Reserved