上一篇博文講了如何製作bochs硬盤鏡像並且將grub裝進去,這樣我們可以在啓動bochs後進入到grub界面。
這篇博文我們將2.4內核寫入硬盤鏡像,這就可以使用bochs直接啓動內核了。
我的實驗系統是這麼部署的:CentOS 6.4 VMware虛擬機上修改代碼和配置文件,用git做版本管理,同時還開着另一臺虛擬機RedHat Linux 7.3,專門用來編譯內核代碼,畢竟2.4內核很老了,編譯環境不能使用現代Linux系統,必須使用2001年左右的系統。每次在CentOS上修改完代碼或配置就在RedHat上用rsync將數據同步下來,進行編譯、安裝、測試,這樣最方便。用於開發的系統不必反覆重啓,用於編譯的系統就是實驗平臺。
編譯內核(這一步在RedHat上進行)
這一步在這裏就不展開講了,我對內核做了精簡,不必要的選項全部關閉了,大大縮短了編譯時間。其中,
Block devices ---> RAM disk support
這個選項也被我關閉了,那內核啓動的時候自然就不需要Initial RAM disk (initrd)了,所以待會兒更改grub.conf的時候不用配置下面這一行了。
initrd /boot/initrd-2.4.0.img
在RedHat上編譯完內核後,arch/i386/boot/bzImage
這個文件就是內核核心了。如果執行 make install
的話,這個文件會被複制到 /boot/vmlinuz-2.4.0
。我們不需要安裝這個內核,而是直接將bzImage複製到CentOS上做後續處理。
掛載硬盤鏡像
緊接着上篇博文,我們將上次的hd.img繼續掛載
losetup -o 32256 /dev/loop0 hd.img mount -t ext3 /dev/loop0 /mnt
這兩步其實可以只用mount就能一步做到
mount -t ext3 -o loop=/dev/loop0,offset=32256 hd.img /mnt
不過我更喜歡兩步到位,清晰明確。
寫入內核
將bzImage複製到 /mnt/boot/
,也就是複製到我們的硬盤鏡像第一分區的boot目錄內。這裏順便重命名爲vmlinuz-2.4.0,看着正規一些。
cp bzImage /mnt/boot/vmlinuz-2.4.0
修改grub.conf
我們上一篇博文安裝grub時,所有的相關文件都是用的宿主系統CentOS 6.4的,所以grub.conf必須要修改一下才能適合我們這個新內核。
gvim /mnt/boot/grub/grub.conf
只更改啓動項部分就行了,改成這樣
title kernel-2.4.0 root (hd0,0) kernel /boot/vmlinuz-2.4.0 ro root=/dev/sda1
按照grub的約定,root (hd0,0)表示grub的根分區在第一塊硬盤的第一分區(自0編號),注意這指的是grub被安裝的分區,不是操作系統文件系統的root分區。
kernel /boot/vmlinuz-2.4.0
指明內核文件是 /boot/vmlinuz-2.4.0
。當然,這個路徑是站在hd.img硬盤鏡像的角度看的,也就是說硬盤鏡像內第一分區是/
分區,該分區下有個boot目錄,裏面含有內核文件vmlinuz-2.4.0
。後面的ro
表示以只讀的方式掛載操作系統的root分區,而root=/dev/sda1
則指明文件系統的root分區在第一硬盤的第一分區。
卸載文件系統
umount /mnt/ losetup -d /dev/loop0
bochs配置
這裏開始使用剛纔製作出來的hd.img可啓動內核鏡像,這裏麪包含2.4.0內核。
運行
bochs
命令會出現命令行菜單,選擇3. Edit options
開始編輯配置,進入12. Disk & Boot options
,把4. First HD/CD on channel 0
設爲hd.img,這個過程需要輸入hd.img的一些參數例如柱面數、磁頭數、每磁道扇區數,其他的參數保持默認即可。然後進入
15. Boot Options
,把1. Boot drive #1: floppy
改爲disk。內存可以不設置,也可以隨便設置下,進入
7. Memory options
->1. Standard Options
->1. RAM size options
後,將memory size
設爲32,將host memory size
設爲64。返回到最開始的菜單,選擇
4. Save options to...
保存下配置,命名爲kdebug.bxrc再選
6. Begin simulation
開始模擬。內核啓動開始。
內核運行
啓動內核之後,你會看到bochs開始啓動內核,最後在掛載VFS時出現panic
BIOS Vendor: The Bochs Project BIOS Version: Bochs BIOS Release: 01/01/2007 Starting kswapd v1.8 SCSI subsystem driver Revision: 1.00 request_module[scsi_hostadapter]: Root fs not mounted request_module[block-major-8]: Root fs not mounted VFS: Cannot open root device "sda1" or 08:01 Please append a correct "root=" boot option Kernel panic: VFS: Unable to mount root fs on 08:01
這很正常,因爲我們的硬盤鏡像第一分區內除了/boot目錄下有點東西外其他都是空的,內核啓動時啥都找不到,自然要掛掉。
過段時間等我研究內核有了進展我會再寫一篇博文,講講如何從RedHat Linux 7.3中抽取必要的文件寫入鏡像,讓內核能夠正常進入系統,不過這一步非常麻煩,能不能實現還不好說。
本文做到這個程度已經足以調試內核了,應該能調試到文件系統初始化部分。
下一步就是Fire up DDD開始調試內核,DDD這個宇宙最強調試器深得我心,一開始看到它簡陋的界面曾讓我失望過,不過當我見識了它宇宙最強的調試功能——數據結構可視化之後,它就成了我永不離手的一件神兵利器。DDD就是這樣,低調不露鋒芒,但是當你祭出它時,天下間將沒有難調的程序。
DDD——讓天下沒有難調的程序,就是這樣。
參考資料:https://www.gnu.org/software/grub/manual/legacy/grub.html#fn-4