Zeal8bit OS在Emulator中的單步調(diào)試

0 前言
本文介紹了如何在網(wǎng)頁Emulator中設(shè)置單步調(diào)試Zeal8bit OS的詳細(xì)操作步驟,結(jié)合Zeal8bit OS源碼可以更加高效、直觀地理解OS的執(zhí)行流程。
這幾天開始閱讀Zeal8bit OS(以下簡稱ZOS)源碼,發(fā)現(xiàn)Z80匯編閱讀起來還是比較困難的,畢竟自己僅有8086/8088匯編的基礎(chǔ),還是很多年前在大學(xué)課堂學(xué)的,這么多年不用早忘得差不多了。
現(xiàn)在去網(wǎng)上搜索Z80匯編能找到的資料也非常有限,畢竟是80年代的CPU了,這極大地加大了我閱讀源碼的難度。不過還好有ChatGPT可以幫忙分析整段晦澀難懂的代碼,勉強(qiáng)支撐著我能將源碼閱讀下去。
但是即使有現(xiàn)代科技加持,面對流程稍微復(fù)雜點(diǎn)的代碼,總會(huì)出現(xiàn)看了這段忘了前面的尷尬局面。比如,閱讀到driver_init代碼時(shí),HL寄存器一直被高頻使用,其寄存器的值也一直在不斷更新,往往閱讀到子程序后開始使用HL寄存器,結(jié)果忘了HL寄存器保存的內(nèi)存地址值指向哪里,結(jié)果還要往前翻找到子程序調(diào)用的地方再次查看,這極大地影響了源碼閱讀理解效率(driver_init過程啃了一個(gè)禮拜都沒有吃透,效率實(shí)在太低下了)。
翻看Emulator的介紹(網(wǎng)址:https://github.com/Zeal8bit/Zeal-WebEmulator/),發(fā)現(xiàn)這個(gè)Web Emulator有單步調(diào)試的功能:

這讓我眼前一亮,如果能把單步調(diào)試搞起來,那就能實(shí)時(shí)追蹤各個(gè)寄存器和內(nèi)存的值,理解源碼的效率直接起飛,豈不美哉?終于,在一番折騰之后(畢竟Zeal8bit大神沒有詳細(xì)給出Emulator使用步驟,各種功能使用全靠自己摸索),終于搞定了Emulator單步調(diào)試ZOS的過程,在此把詳細(xì)設(shè)置步驟分享出來~
1 環(huán)境及所需工具
Linux/Mac OSx
z88dk-dis工具
2 操作步驟
Step 1. OS bin文件和z88dk-dis工具準(zhǔn)備
z88dk-dis是一款能將z80的機(jī)器碼反解析成匯編代碼的工具(詳細(xì)介紹:https://github.com/z88dk/z88dk/wiki/Tool-z88dk-dis)。在我們安裝z80dk-asm工具鏈的時(shí)候,其實(shí)已經(jīng)將z88dk-dis工具安裝上了。z88dk-dis工具安裝和OS bin build詳細(xì)過程見:
Zeal8bit操作系統(tǒng)Build & Run In Emulator (基于Ubuntu)
Zeal8bit操作系統(tǒng)Build & Run In Emulator (基于macOS)
以下步驟以MAC OSx系統(tǒng)中的操作為例。
Step 2. Disassemble Code Dump
在Zeal-8-bit-OS目錄下執(zhí)行命令:
z88dk-dis -o 0 -x build/os.map build/os_with_romdisk.img > disassemble.dump

這條命令的含義是:參照build/os.map中的各個(gè)symbol映射表,將ZOS bin文件build/os_with_romdisk.img中的機(jī)器碼從地址0處開始反匯編,并保存到文件disassemble.dump文件中。這樣,Web Emulator就可以獲得bin文件對應(yīng)的反匯編文件,啟用單步調(diào)試功能了。
Step 4. 文件載入及斷點(diǎn)設(shè)置
將os_with_romdisk.img和disassemble.dump讀入到Web Emulator中,并點(diǎn)擊Read file(s)按鈕,直至下方的OS binary和Symbols兩個(gè)Items前面打上綠色的勾。

然后在Emulator右上方Breakpoints輸入框中輸入斷點(diǎn),斷點(diǎn)可以是具體的指令的內(nèi)存地址也可以是反匯編文件disassemble.dump中的label。比如我輸入反匯編文件中的label 'zos_drivers_init'然后按下Enter鍵,Emulator自動(dòng)給我轉(zhuǎn)換成了指令內(nèi)存地址,并設(shè)置斷點(diǎn)。

Step 5. Run & Step Debug
點(diǎn)擊‘Continue(F9)’按鈕,我們就可以發(fā)現(xiàn),Emulator運(yùn)行就停在了內(nèi)存地址‘0x0382’的‘zos_drivers_init’位置了,然后點(diǎn)擊‘Step(F10)’就可以執(zhí)行單步調(diào)試?yán)瞺



3 后記
隨著單步調(diào)試設(shè)置成功,距離移植ZOS到RV的目標(biāo)的速度也在加快,爭取早日發(fā)布第一版demo,算是對整個(gè)移植過程有個(gè)階段性的成果驗(yàn)收,加油~
