2021-05-12 14:32:11
使用Bochs執行Linux Kernel-2.4.0
上一篇文章講了如何製作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——讓天下沒有難調的程式,就是這樣。http://www.linuxidc.com/Linux/2016-11/137343.htm
參考資料:https://www.gnu.org/software/grub/manual/legacy/grub.html#fn-4
CentOS 6.0 原始碼 編譯 安裝 Bochs http://www.linuxidc.com/Linux/2012-12/76952.htm
openSUSE 安裝Bochs 2.6 http://www.linuxidc.com/Linux/2012-11/75156.htm
Linux0.11 執行環境搭建以及調式--Bochs http://www.linuxidc.com/Linux/2012-11/73902.htm
Ubuntu 12.04安裝帶偵錯功能的Bochs http://www.linuxidc.com/Linux/2012-10/73251.htm
Ubuntu安裝Bochs過程中遇到的問題及解決方法 http://www.linuxidc.com/Linux/2012-05/61422.htm
Ubuntu 14.04 LTS 安裝和設定Bochs http://www.linuxidc.com/Linux/2016-10/135905.htm
Ubuntu上使用Bochs http://www.linuxidc.com/Linux/2016-10/135903.htm
使用bochs和gdb聯合偵錯Linux核心 http://www.linuxidc.com/Linux/2016-11/137342.htm
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-11/137354.htm
相關文章