一. Linux 啟動流程
首先說一下Linux系統大概的啟動過程:
1. 主機加電后, 系統首先加載BIOS, 這個BIOS是以寫在主板上的.
2. BIOS啟動后,執行一些例如開機自檢,硬件初始化等工作,然后讀取硬盤的第一個扇區,這個扇區被稱為MBR.這個扇區中存儲了
一個小程序,叫做boot loader.MBR很小,只有446B. 最常見的一種boot loader叫 grub.
3. boot loader程序主要做兩件事,一個是將內核加載到內存中,另一個是啟動一個虛擬文件系統.內核文件是/boot/vmlinuz*,虛擬文件
系統文件是/boot/initrd*.
4.這個兩個文件加載到內存中后,系統會加載真正的文件系統,然后啟動1號進程init.這樣一個系統就啟動了
下面主要分析一下/boot/vmlinuz和/boot/initrd文件的內容
二. vmlinuz分析
a. mkdir /tmp/vmlinuz&&cp /boot/vmlinuz-4.4.0-21-generic /tmp/vmlinuz/
b. cd /tmp/vmlinuz/
c. od -t x1 -A d vmlinuz-4.4.0-21-generic | grep "1f 8b 08"
本質上,vmlinuz-4.4.0-21-generic 是一個gzip壓縮文件,但是不能直接用gzip指令解壓,因為在這個文件的開頭嵌入了gzip的代碼.
所以首先用指令c找到真正的壓縮文件的頭部.這個指令的輸出形如:
0018864 ac fe ff ff 1f 8b 08 00 00 00 00 00 02 03 ec fd
然后執行下面的指令,其中的18868就是 18864+4,這里4是指1f 8b 08前面有4個字節.
dd if=vmlinuz-4.4.0-21-generic bs=1 skip=18868 | zcat > vmlinuz-gakki
objdump -D vmlinuz-gakki >> result
我們可以看到,最終得到的result就是一個匯編文件.而vmlinuz-gakki文件本質上是一個可執行程序.可以嘗試
執行他, chmod +x vmlinuz-gakki &&./vmlinuz-gakki .
顯示Segmentation fault
二. intrid分析
首先將/boot/intird.img文件復制到/tmp文件夾下
執行file /tmp/initrd.img-4.4.0-21-generic,得到的結果如下:
/tmp/initrd.img-4.4.0-21-generic: gzip compressed data, last modified: Fri Jun 15 13:57:43 2018, from Unix
可以看到本質上這是一個gzip格式的壓縮文件
cd /tmp
mv initrd.img-4.4.0-21-generic initrd.img-4.4.0-21-generic.gz
gzip -d initrd.img-4.4.0-21-generic.gz
file initrd.img-4.4.0-21-generic
得到的結果為:
initrd.img-4.4.0-21-generic: ASCII cpio archive (SVR4 with no CRC)
這是一個cpio文件
執行 cpio -idmv < initrd.img-4.4.0-21-generic
這樣,我們可以看到它最終生成了一個小型的文件系統.