基于Ubuntu build Zeal8bit操作系统 OS,并在Web Emulator上成功运行,踩了不少坑,给想动手尝试一下的同学们分享下~
感谢Zeal8bit大佬带来的基于Z80自制的开源Zeal8bit OS视频分享:
(资料图片仅供参考)
自制8位操作系统【开源】
从整个视频分享过程中我们可以看出大佬扎实的操作系统的知识储备,特别是对Linux操作系统的深刻理解。他几乎把Zeal8bit打造成为Z80 8位CPU量身定制的“极精简版Linux”,让我等围观群众为之叹服。
正好我这边也有自制类似这种“极精简版Linux”的需求,起因是这样的:
自己这边正在学习RISV-CPU的设计,并在FPGA上按照开源代码定制了一个属于自己的RISC-V的小型SOC,添加了SPI接口访问TF卡的IP;
开发了测试代码成功访问到了存储在TF中的hello_world.txt (基于FAT16文件系统)。
心想着事情都进展到这个地步了,不移植个Linux操作系统说不过去了。
奈何本人没文化,操作系统知识储备几乎为零,重新开始学发现能找到的资料要么过于偏向理论性,没有实操,学习效率低下,学习兴趣也会很快消耗殆尽;而有实操的学习资料又是绑定特定的SOC平台,而且重点讲述移植过程的细节,对操作系统本身的讲解并不深入。
第二个困难点是由于我的FPGA平台是一个极小型的国产FPGA平台,有没有外接SDRAM,内存的搭建只能使用内置的SRAM资源,目测极限能把内存做到16 KB。好在有个外接的32MB EEPROM和更大容量的TF卡,这样可以把程序放在EEPROM中运行以节约宝贵的SRAM内存资源。不过这点可怜的内存距离放得下最精简的Linux还相差个数量级。
皇天不负有心人,Zeal8bit大佬的这个视频让我隐约看到了曙光:我可以把Zeal8bit OS移植给我的RISC-V SOC。不过困难也是存在的:大佬的Zeal8bit OS是基于Z80汇编的,从移植性上给我浇了一盆冷水。不过这个已经是我目前能看到的最接近我需求的OS了:
Linux的设计交互和思想;
足够精简;
有开源代码;
有Emulator供实操。
饭都喂到嘴边了,咱们好歹动动嘴嚼两下。咱们就努努力,啃一下Z80的汇编代码,把整个设计思想和flow理解透彻,最后基于RISC-V平台重新实现一个Zeal8bit OS出来。
千里之行的第一步,就是要把大佬视频中的原生开源Source Code在Emulator上运行起来,方便后续学习,修改。有实操反馈,整个学习过程的效率会提高不少。
让咱们开始吧!
Windows 11 (或者Windows 10 版本 2004 及更高版本,WSL的要求);
Python 3及PIP3 Linux版;
z88dk-src-2.2.tgz;
WSL安装
WSL介绍:
开发人员可以在 Windows 计算机上同时访问 Windows 和 Linux 的强大功能。 通过适用于 Linux 的 Windows 子系统 (WSL),开发人员可以安装 Linux 发行版(例如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux 等),并直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具,不用进行任何修改,也无需承担传统虚拟机或双启动设置的费用。
WSL微软官方安装教程:
https://learn.microsoft.com/zh-cn/windows/wsl/install
安装完成输入wsl可以进入Linux系统,logout可以方便退出Linux回到Windows。
Linux下Python 3和PIP3安装
在Linux下安装软件之前先用 “sudo apt-get update” 命令把Ubuntu的apt-get更新到最新,防止后续工具安装出现各种奇奇怪怪的问题。
安装过程可以到网上搜索,资料比较多,我这边也就不重复推荐了。
安装完成之后,确保python3和pip3命令能够正确执行:
接下来就到了坑最多的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 (墙内访问github的方法,在github前加上字母k,后面默认用墙内访问的网址)
可以看到,mac osx和windows平台都是build好直接可用的bin文件,只有Linux需要自己编译,这也是噩梦的开始,各位看官准备好趟本文坑最多的步骤啦~
Step 1. 把下载好的z88dk-src-2.2放到Linux的目录下(推荐不强制)
可以在windows操作系统中下载好z88dk-src-2.2放到Linux目录下,比如我就放在home目录的tools目录下。
Step 2. 解压生成z88dk目录
Step 3. 执行make来build生成z88dk-z80asm的bin文件
在z88dk目录下执行make命令
Build Error 1:Can't locate AA/BB/CC.pm
由于build过程中调用大量的Perl程序,并且调用大量非perl内置的module,所以就会出现找不到module的错误,报错形式如上图所示。解决方法就是用cpan安装对应模块即可,安装命令格式为:sudo cpan install AA::BB::CC。
使用cpan命令可能出现找不到cpan命令的情况,按照提示安装即可。
这是build过程中最大的坑,在网上找了好久才明白这个报错的含义,找到解决方案又是一波三折,所幸能够解决。
Build Error 2:dos2unix not found
这个错误表明dos2unix命令找不到,由于这个比较常用的一个工具,把windows下的文件格式转换到linux能处理的格式,直接使用命令:sudo apt-get install dos2unix 即可安装。
Build Error 3:re2c: No such file or directory
虽然不知道re2c是个什么东西,但是执行re2c命令时,找不到的时候系统会提示如何安装,解决起来也没有啥难度。
Build Error 4:fatal error: libxml/parser.h: No such file or directory
又是一个不知道什么意思的报错,把报错信息原文放到网上去搜索,找了半天,应该是需要安装libxml2-dev工具,用sudo apt-get install libxml2-dev命令安装即可。
安装成功后,能够在/usr目录下找到parser.h
至此,应该所有build问题都被排除,z88dk-z80asm的bin文件成功被build出来~家人们,这种痛苦谁懂啊~
Step 4. source set_eviroment.sh
最后source一下set_enviroment.sh,把z88dk/bin添加到环境变量$PATH中
可能看官自己动手build比我顺利,也更可能比我遇到的问题还多,如果遇到很多莫名其妙的问题,欢迎在评论区留言,有解决方案最佳。
终于所有工具都安装齐全了,开始进入正题build OS的bin文件了~
Step 1. git clone Zeal8bit OS Source Code
执行: git clone https://kgithub.com/Zeal8bit/Zeal-8-bit-OS.git 把OS source code clone到local。
如果git工具没有安装,提供会提示如何安装,这个简单,就不再重复叙述了。
Step 2. Get python kconfiglib
执行:sudo pip3 install kconfiglib安装,确保menuconfig bin文件能够在正确的位置找到。
如下图所示,我所安装的menuconfig bin在/usr/local/bin/目录下和home目录下的.local/bin下都能找到。
然后执行python3 -m site --user-base查看pip3下载的lib的user base安装目录:
按照Zeal8bit大佬的Makefile,启动配置menuconfig是默认用user base目录的menuconfig的。
如果你的user base目录不存在或者没有安装menuconfig,那么建议修改这一行,比如使用/user/local/bin/menuconfig.
Step 3. Excute 'make menuconfig' to generate os.conf file.
这一步按照视频中所说的,执行make menuconfig,按照默认参数配置,按 ‘s’ 保存,把保存文件名修改成“os.conf”,按Enter保存文件,然后Esc退出即可。
确保incldue目录下能生成osconfig.asm.
Step 4. Excute 'make' 生成最终OS的bin文件
执行make,顺利的话会和视频中展示的一样,最终打印出OS的bin信息
不过大概率你不会这么顺利,哈哈,会遇到这个错误:
被坑久了,也免疫了,接着找原因,发现是z88dk-z80asm编译器在target输出目录build下还需要再创建一个build目录,然后target file init_TEXT.bin才会放到build/build/目录下。
老规矩,还是动手修改Makefile,将target/zeal8bit/romdisk/Makefile的第25行和第29行修改成如下的内容:
保存,重新执行make,WOW,成功咯~
Web Emulator:
https://zeal8bit.github.io/Zeal-WebEmulator/
果断打开Web Emulator来尝试一把,emm...发现界面和视频中描述的有点差别,不过没关系,稍微试一下就知道了。
Step 1. Select ‘System binary file’
Step 2. Click ‘Read file(s)'
Step 3. Click 'Continue' Button
你以为就成了?不,还要再和你开最后一次玩笑:
按照视频中Zeal8bit大佬的选择os.bin文件,结果发现没有找到init.bin文件,意味着shell交互界面出不来,就没法愉快的玩耍了么?
其实kernel已经成功运行了,driver也加载进来了,不就少个shell交互界面嘛,可以啦~
哈哈,开个玩笑,没有交互界面还怎么能快乐呢?毕竟我封面的图已经出卖我啦。
其实再build目录下看下,还有个os_with_romdisk.img文件,我们加载一下它看看会不会有奇迹发生?
先刷新下Web Emulator界面,把Step 1中加载‘os.bin’换成加载‘os_with_romdisk.img’,执行后面的steps,然后奇迹就这样降临了~,愉快地ls和less了~
视频中Zeal8bit大佬操作起来轻轻松松,那是人家环境和工具都是配置好的,再加上作为开发者,可以自然地避开各种坑。
但是我们自己实操一下才发现,其中的困难有多大。
话说咱们为啥非要亲自实操一下呢?好问题,我一直觉得,能够自己动手操作一下,哪怕是重复地操作一下,所获得的体验和感悟比仅仅看过一遍要深刻得多,这样学习效率会更高,而且更不容易感到枯燥。
也许这就是“纸上得来终觉浅,绝知此事要躬行”的生动的例子~
下一期,开个坑,把整个flow再Mac OSx上Run起来~
X 关闭