Zeal8bit操作系統(tǒng)Build & Run In Emulator (基于Ubuntu)

0.前言
基于Ubuntu build Zeal8bit操作系統(tǒng) OS,并在Web Emulator上成功運行,踩了不少坑,給想動手嘗試一下的同學(xué)們分享下~
感謝Zeal8bit大佬帶來的基于Z80自制的開源Zeal8bit OS視頻分享:
從整個視頻分享過程中我們可以看出大佬扎實的操作系統(tǒng)的知識儲備,特別是對Linux操作系統(tǒng)的深刻理解。他幾乎把Zeal8bit打造成為Z80 8位CPU量身定制的“極精簡版Linux”,讓我等圍觀群眾為之嘆服。
正好我這邊也有自制類似這種“極精簡版Linux”的需求,起因是這樣的:
自己這邊正在學(xué)習(xí)RISV-CPU的設(shè)計,并在FPGA上按照開源代碼定制了一個屬于自己的RISC-V的小型SOC,添加了SPI接口訪問TF卡的IP;
開發(fā)了測試代碼成功訪問到了存儲在TF中的hello_world.txt (基于FAT16文件系統(tǒng))。
心想著事情都進展到這個地步了,不移植個Linux操作系統(tǒng)說不過去了。
奈何本人沒文化,操作系統(tǒng)知識儲備幾乎為零,重新開始學(xué)發(fā)現(xiàn)能找到的資料要么過于偏向理論性,沒有實操,學(xué)習(xí)效率低下,學(xué)習(xí)興趣也會很快消耗殆盡;而有實操的學(xué)習(xí)資料又是綁定特定的SOC平臺,而且重點講述移植過程的細(xì)節(jié),對操作系統(tǒng)本身的講解并不深入。
第二個困難點是由于我的FPGA平臺是一個極小型的國產(chǎn)FPGA平臺,有沒有外接SDRAM,內(nèi)存的搭建只能使用內(nèi)置的SRAM資源,目測極限能把內(nèi)存做到16 KB。好在有個外接的32MB EEPROM和更大容量的TF卡,這樣可以把程序放在EEPROM中運行以節(jié)約寶貴的SRAM內(nèi)存資源。不過這點可憐的內(nèi)存距離放得下最精簡的Linux還相差個數(shù)量級。
皇天不負(fù)有心人,Zeal8bit大佬的這個視頻讓我隱約看到了曙光:我可以把Zeal8bit OS移植給我的RISC-V SOC。不過困難也是存在的:大佬的Zeal8bit OS是基于Z80匯編的,從移植性上給我澆了一盆冷水。不過這個已經(jīng)是我目前能看到的最接近我需求的OS了:
Linux的設(shè)計交互和思想;
足夠精簡;
有開源代碼;
有Emulator供實操。
飯都喂到嘴邊了,咱們好歹動動嘴嚼兩下。咱們就努努力,啃一下Z80的匯編代碼,把整個設(shè)計思想和flow理解透徹,最后基于RISC-V平臺重新實現(xiàn)一個Zeal8bit?OS出來。
千里之行的第一步,就是要把大佬視頻中的原生開源Source Code在Emulator上運行起來,方便后續(xù)學(xué)習(xí),修改。有實操反饋,整個學(xué)習(xí)過程的效率會提高不少。
讓咱們開始吧!
1. 環(huán)境及所需工具
Windows 11 (或者Windows 10 版本 2004 及更高版本,WSL的要求);
Python 3及PIP3?Linux版;
z88dk-src-2.2.tgz;
2. 工具安裝
WSL安裝
WSL介紹:
開發(fā)人員可以在 Windows 計算機上同時訪問 Windows 和 Linux 的強大功能。 通過適用于 Linux 的 Windows 子系統(tǒng) (WSL),開發(fā)人員可以安裝 Linux 發(fā)行版(例如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux 等),并直接在 Windows 上使用 Linux 應(yīng)用程序、實用程序和 Bash 命令行工具,不用進行任何修改,也無需承擔(dān)傳統(tǒng)虛擬機或雙啟動設(shè)置的費用。
WSL微軟官方安裝教程:
https://learn.microsoft.com/zh-cn/windows/wsl/install
安裝完成輸入wsl可以進入Linux系統(tǒng),logout可以方便退出Linux回到Windows。

Linux下Python 3和PIP3安裝
在Linux下安裝軟件之前先用 “sudo apt-get update” 命令把Ubuntu的apt-get更新到最新,防止后續(xù)工具安裝出現(xiàn)各種奇奇怪怪的問題。
安裝過程可以到網(wǎng)上搜索,資料比較多,我這邊也就不重復(fù)推薦了。
安裝完成之后,確保python3和pip3命令能夠正確執(zhí)行:

3. z88dk Build
接下來就到了坑最多的z88dk-z80asm的bin文件build過程。眾所周知,Linux想要安裝軟件一般都需要下載source code自己build出bin文件,咱們的z80編譯器安裝也遵循這一套路。
下載z88dk source code
下載地址:
https://github.com//z88dk/z88dk/releases (可直接訪問github的情況下)
https://kgithub.com//z88dk/z88dk/releases (墻內(nèi)訪問github的方法,在github前加上字母k,后面默認(rèn)用墻內(nèi)訪問的網(wǎng)址)

可以看到,mac osx和windows平臺都是build好直接可用的bin文件,只有Linux需要自己編譯,這也是噩夢的開始,各位看官準(zhǔn)備好趟本文坑最多的步驟啦~
Step 1. 把下載好的z88dk-src-2.2放到Linux的目錄下(推薦不強制)
可以在windows操作系統(tǒng)中下載好z88dk-src-2.2放到Linux目錄下,比如我就放在home目錄的tools目錄下。

Step 2. 解壓生成z88dk目錄

Step 3. 執(zhí)行make來build生成z88dk-z80asm的bin文件
在z88dk目錄下執(zhí)行make命令

Build Error 1:Can't locate AA/BB/CC.pm

由于build過程中調(diào)用大量的Perl程序,并且調(diào)用大量非perl內(nèi)置的module,所以就會出現(xiàn)找不到module的錯誤,報錯形式如上圖所示。解決方法就是用cpan安裝對應(yīng)模塊即可,安裝命令格式為:sudo cpan install AA::BB::CC。

使用cpan命令可能出現(xiàn)找不到cpan命令的情況,按照提示安裝即可。
這是build過程中最大的坑,在網(wǎng)上找了好久才明白這個報錯的含義,找到解決方案又是一波三折,所幸能夠解決。
Build Error 2:dos2unix not found
這個錯誤表明dos2unix命令找不到,由于這個比較常用的一個工具,把windows下的文件格式轉(zhuǎn)換到linux能處理的格式,直接使用命令:sudo apt-get install dos2unix 即可安裝。

Build Error 3:re2c: No such file or directory
雖然不知道re2c是個什么東西,但是執(zhí)行re2c命令時,找不到的時候系統(tǒng)會提示如何安裝,解決起來也沒有啥難度。

Build Error 4:fatal error: libxml/parser.h: No such file or directory
又是一個不知道什么意思的報錯,把報錯信息原文放到網(wǎng)上去搜索,找了半天,應(yīng)該是需要安裝libxml2-dev工具,用sudo apt-get install libxml2-dev命令安裝即可。

安裝成功后,能夠在/usr目錄下找到parser.h

至此,應(yīng)該所有build問題都被排除,z88dk-z80asm的bin文件成功被build出來~家人們,這種痛苦誰懂啊~

Step 4. source set_eviroment.sh
最后source一下set_enviroment.sh,把z88dk/bin添加到環(huán)境變量$PATH中

可能看官自己動手build比我順利,也更可能比我遇到的問題還多,如果遇到很多莫名其妙的問題,歡迎在評論區(qū)留言,有解決方案最佳。
4. Image Build
終于所有工具都安裝齊全了,開始進入正題build OS的bin文件了~
Step 1. git clone Zeal8bit OS Source Code
執(zhí)行: git clone https://kgithub.com/Zeal8bit/Zeal-8-bit-OS.git 把OS source code clone到local。

如果git工具沒有安裝,提供會提示如何安裝,這個簡單,就不再重復(fù)敘述了。
Step 2. Get python kconfiglib
執(zhí)行:sudo pip3 install kconfiglib安裝,確保menuconfig bin文件能夠在正確的位置找到。
如下圖所示,我所安裝的menuconfig bin在/usr/local/bin/目錄下和home目錄下的.local/bin下都能找到。

然后執(zhí)行python3 -m site --user-base查看pip3下載的lib的user base安裝目錄:

按照Zeal8bit大佬的Makefile,啟動配置menuconfig是默認(rèn)用user base目錄的menuconfig的。

如果你的user base目錄不存在或者沒有安裝menuconfig,那么建議修改這一行,比如使用/user/local/bin/menuconfig.

Step 3. Excute 'make menuconfig'?to generate os.conf file.
這一步按照視頻中所說的,執(zhí)行make menuconfig,按照默認(rèn)參數(shù)配置,按 ‘s’ 保存,把保存文件名修改成“os.conf”,按Enter保存文件,然后Esc退出即可。

確保incldue目錄下能生成osconfig.asm.
Step 4. Excute 'make' 生成最終OS的bin文件
執(zhí)行make,順利的話會和視頻中展示的一樣,最終打印出OS的bin信息

不過大概率你不會這么順利,哈哈,會遇到這個錯誤:

被坑久了,也免疫了,接著找原因,發(fā)現(xiàn)是z88dk-z80asm編譯器在target輸出目錄build下還需要再創(chuàng)建一個build目錄,然后target file init_TEXT.bin才會放到build/build/目錄下。
老規(guī)矩,還是動手修改Makefile,將target/zeal8bit/romdisk/Makefile的第25行和第29行修改成如下的內(nèi)容:

保存,重新執(zhí)行make,WOW,成功咯~

5. Run OS in Web Emulator
Web Emulator:
https://zeal8bit.github.io/Zeal-WebEmulator/
果斷打開Web Emulator來嘗試一把,emm...發(fā)現(xiàn)界面和視頻中描述的有點差別,不過沒關(guān)系,稍微試一下就知道了。
Step 1. Select ‘System binary file’

Step 2. Click ‘Read file(s)'

Step 3. Click 'Continue' Button

你以為就成了?不,還要再和你開最后一次玩笑:

按照視頻中Zeal8bit大佬的選擇os.bin文件,結(jié)果發(fā)現(xiàn)沒有找到init.bin文件,意味著shell交互界面出不來,就沒法愉快的玩耍了么?
其實kernel已經(jīng)成功運行了,driver也加載進來了,不就少個shell交互界面嘛,可以啦~

哈哈,開個玩笑,沒有交互界面還怎么能快樂呢?畢竟我封面的圖已經(jīng)出賣我啦。
其實再build目錄下看下,還有個os_with_romdisk.img文件,我們加載一下它看看會不會有奇跡發(fā)生?
先刷新下Web Emulator界面,把Step 1中加載‘os.bin’換成加載‘os_with_romdisk.img’,執(zhí)行后面的steps,然后奇跡就這樣降臨了~,愉快地ls和less了~

6. 總結(jié)
視頻中Zeal8bit大佬操作起來輕輕松松,那是人家環(huán)境和工具都是配置好的,再加上作為開發(fā)者,可以自然地避開各種坑。
但是我們自己實操一下才發(fā)現(xiàn),其中的困難有多大。
話說咱們?yōu)樯斗且H自實操一下呢?好問題,我一直覺得,能夠自己動手操作一下,哪怕是重復(fù)地操作一下,所獲得的體驗和感悟比僅僅看過一遍要深刻得多,這樣學(xué)習(xí)效率會更高,而且更不容易感到枯燥。
也許這就是“紙上得來終覺淺,絕知此事要躬行”的生動的例子~
下一期,開個坑,把整個flow再Mac OSx上Run起來~
