調(diào)試 Linux 最早期的代碼
Linux 0.11 是 Linux 最早期的代碼,非常適合作為第一款深入探索操作系統(tǒng)原理的代碼。
?
但同時(shí),Linux 0.11 因?yàn)楹芏喙爬瞎ぞ哝湹娜笔?,以及一些過(guò)時(shí)的文件格式比如 a.out,導(dǎo)致成功編譯并運(yùn)行它十分困難,更別說(shuō)進(jìn)行源碼級(jí)別的 debug 調(diào)試了。
?
要想成功調(diào)試 Linux 0.11,需要進(jìn)行很多改造,并依賴一些古老的工具鏈,對(duì)于僅僅是將 Linux 0.11 作為研究操作系統(tǒng)的手段的我們,無(wú)需花費(fèi)精力自己去改造它,踩各種坑。
?
所以今天我就分享一下我調(diào)試 Linux 0.11 的一種方式,同時(shí)也為了我自己以后換電腦的時(shí)候方便照著自己的教程直接無(wú)腦搭建環(huán)境,那我們開(kāi)始吧~
?
整體思路和效果
?
我用的方式是,在 windows 上,搞一個(gè) Ubuntu 16.04 的虛擬機(jī),在里面用 qemu 啟動(dòng)一個(gè)開(kāi)啟了調(diào)試的 Linux 0.11 系統(tǒng),然后用本機(jī)的 vscode remote ssh 連接到虛擬機(jī),并開(kāi)啟 gdb 調(diào)試,最終的效果如下。
?

?
這是最舒服的方式,因?yàn)?vscode 是本機(jī)的,完全不受虛擬機(jī)的影響,這也是我調(diào)試其他代碼時(shí)比較喜歡的方式。
?
如果你有自己的豪華服務(wù)器,虛擬機(jī)也可以換成服務(wù)器,這樣不但編譯速度快,不消耗自己電腦的性能,同時(shí)也可以不受終端的影響,在家在公司都可以隨時(shí)調(diào)試(方便摸魚~)
?
當(dāng)然如果你不需要這么直觀 vscode 這一步也可以換成 gdb 命令行,在虛擬機(jī)里直接執(zhí)行 gdb 相關(guān)命令即可。
?

?
下面我們就一步步來(lái)實(shí)現(xiàn)這個(gè)效果。
?
第一步:配置虛擬機(jī)
?
我用的虛擬機(jī)軟件是
Oracle VM VirtualBox Version 6.0.8 Edition
?
官網(wǎng)是:
https://ubuntu.com/
下載頁(yè)面是:
https://www.virtualbox.org/wiki/Download_Old_Builds_6_0
我這個(gè)版本的直接下載地址是:
https://download.virtualbox.org/virtualbox/6.0.8/VirtualBox-6.0.8-130520-Win.exe
?
安裝的操作系統(tǒng)鏡像是
ubuntu-16.04.7-desktop-amd64
?
官網(wǎng)是:
https://ubuntu.com/
下載頁(yè)面是:
https://releases.ubuntu.com/xenial/
我這個(gè)版本的直接下載地址是:
https://releases.ubuntu.com/xenial/ubuntu-16.04.7-desktop-amd64.iso
?
這個(gè)就不詳細(xì)展開(kāi)講解了,最終達(dá)到這個(gè)效果就行。
?

?
?
第二步:安裝 qemu
?
qemu 是模擬器,簡(jiǎn)單理解和虛擬機(jī)一樣,用來(lái)當(dāng)做真機(jī)啟動(dòng) Linux 0.11 的。
?
官網(wǎng)是這個(gè):
https://www.qemu.org/
?
我們?cè)趧倓偟?Ubuntu 虛擬機(jī)里直接按照官方教程下載 qemu
sudo apt-get install qemu
?
下載好后,我們輸入 qemu-,按兩下 tab,查看下支持的體系結(jié)構(gòu)。
?

?
看到有 qemu-system-x86_64 即可,一會(huì)我們會(huì)用這個(gè)來(lái)模擬啟動(dòng) Linux 0.11。
?
第三步:下載并運(yùn)行可調(diào)試的 Linux 0.11 源碼
?
這一步直接下官網(wǎng)上的是不行的,因?yàn)槟莻€(gè)依賴好多古老的工具鏈。
?
這里一般網(wǎng)上都是參考了趙炯老師為我們修改好的 Linux 0.11 源碼,用現(xiàn)代的工具鏈即可構(gòu)建,造福了廣大熱愛(ài)內(nèi)核的開(kāi)發(fā)者,我們直接拿來(lái)主義即可。
?
在趙炯老師準(zhǔn)備好的源碼的基礎(chǔ)上,很多人又進(jìn)行了二次改造,使得其可以一鍵 qemu 或 bochs 啟動(dòng),這里我選擇了倉(cāng)庫(kù):
?
https://github.com/yuan-xy/Linux-0.11
?
直接把源碼下載下來(lái),進(jìn)入根目錄,輸入命令 make start 就可以把 Linux 0.11 跑起來(lái)了。
?

?
如果想 debug,那么就以 debug 形式啟動(dòng),輸入命令 make debug,它會(huì)卡住不動(dòng)。
?

?
此時(shí)其實(shí)你就可以通過(guò) gdb 進(jìn)行調(diào)試了。
?
再開(kāi)一個(gè)窗口,輸入命令?gdb tools/system
然后?target remote :1234
就可以愉快地進(jìn)行 gdb 調(diào)試了
?

?
具體 gdb 怎么玩,就不展開(kāi)講解了。
?
第四步:通過(guò) vscode 遠(yuǎn)程調(diào)試
?
當(dāng)然,你也可以在虛擬機(jī)里用 vscode 進(jìn)行本地調(diào)試,但我覺(jué)得不爽。
?
所以,在本機(jī)的 windows 里安裝好 vscode,下載 remote-ssh 插件。
?

?
下載好后按下 ctrl + p,輸入 >remote-ssh,找到 Connect to Host
?

?
按照它提示的格式輸入你的虛擬機(jī) IP 和用戶名,隨后輸入密碼,即可遠(yuǎn)程連接到虛擬機(jī)。
?
之后點(diǎn)擊菜單欄 運(yùn)行-啟用調(diào)試,在彈出的 launch.json 中做如下配置
?

{
????"version":?"0.2.0",
????"configurations":?[
????????{
????????????"name":?"(gdb)?Launch",
????????????"type":?"cppdbg",
????????????"request":?"launch",
????????????"program":?"${workspaceFolder}/tools/system",
????????????"miDebuggerServerAddress":?"127.0.0.1:1234",
????????????"args":?[],
????????????"stopAtEntry":?false,
????????????"cwd":?"${workspaceFolder}",
????????????"environment":?[],
????????????"externalConsole":?false,
????????????"MIMode":?"gdb"
????????}
????]
}
配置好后保存,在 main 函數(shù)里打個(gè)斷點(diǎn),再次點(diǎn)擊菜單欄 運(yùn)行-啟用調(diào)試,可以發(fā)現(xiàn)調(diào)試成功。
?

?
當(dāng)然,記得每次 vscode 調(diào)試前,在虛擬機(jī)里先把 Linux 0.11 跑起來(lái),就是執(zhí)行命令 make debug。
?
這一步也可以配置到 vscode 里,但這一步?jīng)]多少工作量,而且也不方便直觀看到虛擬機(jī)里的行為,我就懶得弄了。
?
好了,這個(gè)教程到這里就結(jié)束了,這就是我調(diào)試 Linux 0.11 的其中一個(gè)辦法,當(dāng)然每個(gè)人可能都有自己喜歡的方式,只要適合自己就好。
