調(diào)試 Linux 最早期的代碼
點(diǎn)擊關(guān)注公眾號,Java干貨及時(shí)送達(dá)

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

?
下面我們就一步步來實(shí)現(xiàn)這個(gè)效果。
?
第一步:配置虛擬機(jī)
?
我用的虛擬機(jī)軟件是
Oracle VM VirtualBox Version 6.0.8 Edition
?
官網(wǎng)是:
https://ubuntu.com/
下載頁面是:
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/
下載頁面是:
https://releases.ubuntu.com/xenial/
我這個(gè)版本的直接下載地址是:
https://releases.ubuntu.com/xenial/ubuntu-16.04.7-desktop-amd64.iso
?
這個(gè)就不詳細(xì)展開講解了,最終達(dá)到這個(gè)效果就行。
?

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

?
看到有 qemu-system-x86_64 即可,一會我們會用這個(gè)來模擬啟動(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)建,造福了廣大熱愛內(nèi)核的開發(fā)者,我們直接拿來主義即可。
?
在趙炯老師準(zhǔn)備好的源碼的基礎(chǔ)上,很多人又進(jìn)行了二次改造,使得其可以一鍵 qemu 或 bochs 啟動(dòng),這里我選擇了倉庫:
?
https://github.com/yuan-xy/Linux-0.11
?
直接把源碼下載下來,進(jìn)入根目錄,輸入命令 make start 就可以把 Linux 0.11 跑起來了。
?

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

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

?
具體 gdb 怎么玩,就不展開講解了。
?
第四步:通過 vscode 遠(yuǎn)程調(diào)試
?
當(dāng)然,你也可以在虛擬機(jī)里用 vscode 進(jìn)行本地調(diào)試,但我覺得不爽。
?
所以,在本機(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 跑起來,就是執(zhí)行命令 make debug。
?
這一步也可以配置到 vscode 里,但這一步?jīng)]多少工作量,而且也不方便直觀看到虛擬機(jī)里的行為,我就懶得弄了。
?
????
往 期 推 薦
1、拖動(dòng)文件就能觸發(fā)7-Zip安全漏洞,波及所有版本
3、一次 SQL 查詢優(yōu)化原理分析:900W+ 數(shù)據(jù),從 17s 到 300ms
4、Redis數(shù)據(jù)結(jié)構(gòu)為什么既省內(nèi)存又高效?
點(diǎn)分享
點(diǎn)收藏
點(diǎn)點(diǎn)贊
點(diǎn)在看





