在操作系統(tǒng)開發(fā)中選bochs還是qemu

最近有同學(xué)問我:為什么你的從0寫x86 Linux操作系統(tǒng)課程 選擇了bochs,而不是qemu?他認(rèn)為bochs更加好用,很多資料上都寫了用該軟件。其實(shí)我也是經(jīng)過不斷地對(duì)比和嘗試后,選擇使用qemu。
Bochs和QEMU是兩個(gè)著名的模擬器,均可用于模擬x86計(jì)算機(jī),網(wǎng)上有很多寫如何開發(fā)操作系統(tǒng)的資料用到了其中一個(gè)。在這里我對(duì)這兩個(gè)軟件的特點(diǎn)、支持的平臺(tái)、調(diào)試手段和易用性等方面進(jìn)行詳細(xì)介紹。
軟件特點(diǎn)

Bochs是一個(gè)用C++編寫的開源模擬器,僅可模擬x86計(jì)算機(jī)硬件環(huán)境,包括CPU、內(nèi)存、硬盤、顯示器、網(wǎng)卡等。能夠運(yùn)行各種不同的操作系統(tǒng),如DOS、Windows、Linux、BSD等。還支持許多外部設(shè)備,如鍵盤、鼠標(biāo)、串口、并口等。此外,Bochs還支持多種調(diào)試方式,如斷點(diǎn)、單步執(zhí)行、內(nèi)存監(jiān)視等。

QEMU是一個(gè)快速的開源模擬器和虛擬機(jī)管理器,能夠模擬x86、ARM、PowerPC、SPARC等多種CPU架構(gòu)。相比bochs,其特點(diǎn)在于它的快速性,能夠運(yùn)行本機(jī)代碼,實(shí)現(xiàn)在模擬器中運(yùn)行的虛擬機(jī)與物理機(jī)的速度相當(dāng)。QEMU還支持各種外部設(shè)備,如USB設(shè)備、串口、網(wǎng)卡等。此外,QEMU還能夠通過GDB、VNC等多種調(diào)試方式進(jìn)行調(diào)試。
由于我是開發(fā)一個(gè)面向x86硬件的小操作系統(tǒng),所以單純從功能上來說,兩個(gè)軟件似乎都合適。
支持平臺(tái)
Bochs可以運(yùn)行在多種操作系統(tǒng)平臺(tái)上,包括Windows、Linux、macOS等,可以模擬各種不同的操作系統(tǒng)。但是在有些平臺(tái)上,可能需要重新編譯源碼才能獲得可執(zhí)行的程序。
QEMU也支持多種操作系統(tǒng)平臺(tái),包括Windows、Linux、macOS等。QEMU的特點(diǎn)在于它能夠在多種不同的CPU架構(gòu)之間進(jìn)行模擬,例如在x86主機(jī)上模擬ARM架構(gòu)的操作系統(tǒng)。
在實(shí)際使用了這兩款軟件后,我發(fā)現(xiàn)qemu更加方便,官方直接提供了針對(duì)win/linux/mac的安裝包,而bochs針對(duì)有的平臺(tái)提供,有的卻要自己重新編譯源碼,非常的麻煩。
調(diào)試手段
當(dāng)談到操作系統(tǒng)開發(fā)時(shí),調(diào)試是至關(guān)重要的。Bochs和QEMU都提供了各種調(diào)試手段,以幫助用戶診斷和調(diào)試操作系統(tǒng)。不過,從我的使用經(jīng)驗(yàn)來說,使用qemu進(jìn)行操作系統(tǒng)開發(fā)時(shí),可以提供相比bochs更為豐富的調(diào)試手段。

雖然bochs提供了許多內(nèi)置的調(diào)試命令,如break、step、registers等,可以讓用戶在模擬器中單步執(zhí)行和檢查CPU寄存器的值。但是這些命令僅限于命令行的交互模式下使用,而在這種模式下,只能進(jìn)行指令級(jí)調(diào)試,無法進(jìn)行源碼級(jí)調(diào)試,使用起來非常不方便。所以,我覺得更適合于調(diào)試匯編代碼。
當(dāng)然,Bochs也支持GDB調(diào)試,但是需要重新編譯源碼生成帶GDB支持的bochs,非常麻煩。而且在GDB模式下,內(nèi)置的調(diào)試命令將無法使用。
而QEMU也提供了許多調(diào)試功能,例如單步執(zhí)行、斷點(diǎn)和CPU寄存器查看等,這些命令在monitor窗口中可直接使用。如下圖所示,在進(jìn)入該窗口后,可以直接輸入各種命令,實(shí)現(xiàn)bochs同樣的命令的功能。這些命令,可以有效的幫助同學(xué)分析開發(fā)過程中的各種問題。

與此同時(shí),還支持GDB調(diào)試器,可以結(jié)合vscode直接進(jìn)行源碼級(jí)調(diào)試,如內(nèi)存查看、寄存器修改等。這個(gè)是非常非常重要的一項(xiàng)功能!我之所以選擇qemu,最大的原因也在于此。qemu直接內(nèi)置了GDB的支持,不需要像bochs那樣還要重新編譯源碼。我在對(duì)vscode的工程中進(jìn)行了配置,可以直接一鍵源碼級(jí)調(diào)試boot、loader、kernel,還有應(yīng)用程序,非常地方便。通過這樣的配合,可以使得同學(xué)在課程的學(xué)習(xí)中將關(guān)注點(diǎn)完全集中在操作系統(tǒng)實(shí)現(xiàn)本身的學(xué)習(xí)上,而不用關(guān)注工具的使用。

因此,在調(diào)試手段上,我認(rèn)為QEMU似乎是一個(gè)更好的選擇,尤其對(duì)于那些希望更快地上手和入門的初學(xué)者。
易用性
相對(duì)bochs來說,我覺得QEMU更為易于使用。
對(duì)于初學(xué)者來說,QEMU可能會(huì)更容易使用,因?yàn)樗拿钚袇?shù)和配置文件更簡(jiǎn)單,也更直觀。在課程提供的工程中,我為qemu添加了一個(gè)啟動(dòng)腳本,只需要通過命令行參數(shù)就可以完成虛擬機(jī)的各項(xiàng)配置,非常簡(jiǎn)單。

而Bochs則可能需要更多的配置和調(diào)整,以便正確運(yùn)行操作系統(tǒng)。它需要一個(gè)單獨(dú)的配置文件,里面保存了虛擬機(jī)的各種配置細(xì)節(jié),為了修改該配置文件,還需要使用相應(yīng)的工具,比較麻煩。
總結(jié)
綜合考慮以上因素,我最終選擇的是QEMU,因?yàn)槠湓诓僮飨到y(tǒng)開發(fā)中更加適合初學(xué)者。這個(gè)軟件提供了更好的易用性和靈活性,以及對(duì)于調(diào)試手段的支持。