⑴ bootloader和bootstrap的區別
bootloader
和
bootstrap
的區別
在
《embedded
linux
primer
》上看到的,其實還有一些分歧和不精確的地方,
比如bootstrap
和bootstrap
loader似乎在PC上還有區別,不過還是不影響理解了
http://www.devbone.com/leadbbs/MINI/Default.asp?100-2246-0-0-0-0-0-a-.htm
又如RedBoot(RedHat
Embedded
Debug
and
Bootstrap),本質是一個bootloader但名字又有bootstrap,讓人郁悶
http://sourceware.org/redboot/
這里僅限於嵌入式+ARM+Linux環境
bootloader
翻譯為
(第一階段)引導裝入程序
bootstrap
loader
翻譯為
第二階段引導裝入程序
bootloader不用多解釋都能理解--上電後執行的第一個程序,它絕對不會依賴內核。比如uboot、vivi
bootstrap,第二階段引導裝入程序,屬於內核代碼(沒有被編譯進vmlinux,但是可執行的鏡像如zImage中含有bootstrap
),充當bootloader和內核鏡像之間的紐帶。
bootstrap通常會校驗內核鏡像、
解壓縮
內核鏡像、重新部署內核鏡像到內存、為內核執行提供合適的上下文(無非是關中斷、開指令cache和數據cache、設置c語言運行環境)
執行流程
上電-->bootloader
-->bootstrap(head.o)-->內核vmlinux(head.o)-->內核start_kernel(main.o)
以上兩個head.o並不相同
bootstrap用的是/arch/arm/boot/compressed/head.S
內核vmlinux用的是/arch/arm/kernel/head.S
雖然都是head.o,但是不在一個時代了,自此區分開了bootstrap和內核vmlinux
等於你看到Uncompressing
Linux...
done,
booting
the
kernel.
還屬於bootstrap
等到列印出第二行
內核版本
信息的時候,就已經是真正的內核main.o的時代了
一個嚴格意義上的內核,make的一個最重要的生成文件
vmlinux
去掉了符號、標記和注釋後生成了image
gzip壓縮後變成piggy.gz
接下來,一個名為piggy.s的文件被匯編成piggy.o
非常有意思的是它僅有7行代碼,其實就只有把piggy.gz
包含進來的作用
.section
.piggydata,#alloc
.globl
input_data
input_data:
.incbin
"arch/arm/boot/compressed/piggy.gz"
.globl
input_data_end
input_data_end:
接著piggy.o同misc.o、head.o等屬於bootstrap的代碼一起鏈接成為zImage等可以被引導的合成鏡像。
其中misc.o負責解壓縮、head.o
head_xx.o
負責進行內核上下文的初始化