柴米油鹽計劃

Kbuild 編譯 Linux 內核系列(九)

Author : Wei Yang
作者公眾號:楊小偉的世界

書接上回, bzImage 由 setup.bin 和 vmlinux.bin 兩個文件粘合而成。這次我們來看看 setup.bin 的誕生記。

尋找目標

老套路,第一步就是找一下 setup.bin 這個目標的規則。還記得之前我們走到哪裡了么?對, arch/x86/boot/Makefile

$(obj)/setup.bin: $(obj)/setup.elf FORCE
    $(call if_changed,objcopy)

下一步呢? 對了,找 cmd_objcopy 。這次定義的地方稍有不同,不在 scripts/Makefile.build ,而是在 scripts/Makefile.lib 。

# Objcopy
# -------------------------------------

quiet_cmd_objcopy = OBJCOPY $@
cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@

原來 setup.bin 是由 setup.elf 經過 objcopy 而來。那看來想要弄清楚就要看看 setup.elf 的來歷。走,既然已經到這裡了,那咱就再入一層~

深入虎穴

$(obj)/setup.elf: $(src)/setup.ld $(SETUP_OBJS) FORCE
    $(call if_changed,ld)

怎麼樣,現在是不是駕輕就熟了。看到這個也基本能夠猜出個八九不離十。 setup.elf 是由$(SETUP_OBJS) 鏈接而成的。嗯,沒想到這麼簡單,白白浪費了我這麼氣勢磅礴的一個標題了。

為了彌補點什麼,咱把 SETUP_OBJS 的內容也給大家展開了。

SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))

原來還套了那麼一層:

setup-y     += a20.o bioscall.o cmdline.o copy.o cpu.o cpuflags.o cpucheck.o
setup-y     += early_serial_console.o edd.o header.o main.o memory.o
setup-y     += pm.o pmjump.o printf.o regs.o string.o tty.o video.o
setup-y     += video-mode.o version.o
setup-$(CONFIG_X86_APM_BOOT) += apm.o

# The link order of the video-*.o modules can matter.  In particular,
# video-vga.o *must* be listed first, followed by video-vesa.o.
# Hardware-specific drivers should follow in the order they should be
# probed, and video-bios.o should typically be last.
setup-y     += video-vga.o
setup-y     += video-vesa.o
setup-y     += video-bios.o

嗯,夠多,終於能勉強配得上咱這個霸氣的標題了~

圖文並茂

setup.bin 的編譯過程確實簡單,來一張圖略微總結那麼一下子。

        a20.o bioscall.o cmdline.o copy.o
        cpu.o cpuflags.o cpucheck.o
        edd.o header.o main.o memory.o
        tty.o pmjump.o printf.o regs.o
        pm.o  string.o video.o
        video-mode.o version.o
        early_serial_console.o

        video-vga.o
        video-vesa.o
        video-bios.o

                    ||
                    \/

                 setup.elf

                    ||
                    \/

                 setup.bin

這麼一看,東西還挺多的啊。 好了,這個我們也看完啦,是不是感覺so easy~

未完待續

bzImage 的組成部分除了 setup.bin 還有另一半— vmlinux.bin 。是不是它也這麼簡單明了呢?是不是它能解除我們心中的一些疑惑呢?

不要走開,即將呈現~


本文是 LinuxStory 柴米油鹽計劃的投稿文章,由 LinuxStory 整理髮布。
原作者署名為:Wei Yang 。
轉載請註明出處,否則必究相關責任。
本文鏈接:https://linuxstory.org/kbuild-linux-9/

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
這裡是柴米油鹽計劃投稿的發布賬號。

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據