写一个 OS 是多麽美好的事,在有限的生命中千万不要遗漏了它。
-- 王佑中博士
笔者在开始撰写本系列文前不曾接触过嵌入式系统开发,也很少触碰 C 语言,不过,在看到 COSCUP 2012 的第一次自干作业系统核心就上手的议程录影後受到不小的冲击。虽然我不像 Jserv 大大能在短短的 20 分钟内自干作业系统。但是,我们也可以透过阅读相关文献以及专案原始码更加了解作业系统这个有趣的学科。
此外,James Bach 说过一段笔者非常喜欢的话,在这边分享给大家:
假如
你能把重要的事做完
别人有看到你在自我学习
别人看到你在学习做事,即使你不确定该怎麽做
你无私地和人分享你所学的东西
你不隐藏你的无知,也不安於你的无知
你尊重别人所知洞悉
你通常知道如何找到你所不知道的东西
你知道如何寻求帮助
你提供对别人的帮助,而且是以他的方式帮他
那麽
没人会在意你的成功是来自自学或是已知的知识
没有会在乎你偶尔的失误
没人会在意你在某个时间不知道某种特定知识
如果你跟笔者一样是个喜欢作业系统但是平常没有在接触 C/C++ 的人,我认为这并不是什麽太严重的问题,毕竟 C 语言就是设计来开发 UNIX 作业系统的,所以在学习作业系统的过程中一定会越发熟练 :D
在实务上,我们用来开发的平台可能会与目标平台不同,例如: 在 x86 平台开发 RISC-V 的作业系统,这时候我们就会需要利用 Cross Compiler 去做处理。
下文提到了一些系统程序开发的专有名词。
Makefile
Linker script
Simulator, Emulator, VM
单纯用软件去模拟,就好比我们用物件导向写了一个机器人程序,他就算是机器人的 Simulator。
Emulator 比其软件模拟,它能够直接/间接的操作硬体,以 QEMU 为例,它就是一个十分接近真实电脑的 Emulator。
Cross debugger
Cross debugger 用於对 Target 上 application 的除错,就好比 Debugger 与 Host computer 的关系。
常见的 Debug 工具: kdb, kgdb, gdb,本系列文也在 gdb 的介绍时提过如何在嵌入式系统开发中使用 gdb。
Cross kernel debugger
ICE
GNU Debugger,简称 GDB ,是 GNU 软件系统中的除错器,由於其具有可移植的优点,在现今的主流处理器架构与作业系统平台上都可以看见 GDB 的身影。
更多细节请参考 GNU Debugger 一文。
Make 是一套自动化建构软件,它读取名为 Makefile 的档案,并根据使用者输入的命令找到 target 後生成命令转交给 shell 去执行,以生成开发者需要的可执行档案。 不只如此, Make 还具有依赖关系的检查系统,可以帮助开发者高效的进行测试与编译工作。
更多细节请参考 Makefile 一文。
比较 A 与 B 版本的差异,将其整理出来做成 Patch。
版本控制工具,方便我们处理多人开发时产生的冲突问题。
更多细节请参考 Git 与那些多人混战的开发经验谈一文。
malloc / new
和 free / delete
。
注意: 其资料结构不是 heap 而是 linked list。
实务上,我们会将写好的 C Code 编译成 *.o
档,再透过 Linker 输出成可执行档案,像是 *.out
、 *.elf
等。在本系列之前的文章中已经向大家介绍过组译器以及连结器、可执行与可链接格式 elf
,因此,本篇不再多做介绍。
在正式进入系统程序的教学之前,我们需要安装支援 RISC-V 的编译工具包,才能编译出可运行在 RISC-V Target Machine 的执行档:
D:\install\FreedomStudio-2020-06-3-win64\SiFive\riscv64-unknown-elf-gcc-8.3.0-2020.04.1\bin
D:\install\FreedomStudio-2020-06-3-win64\SiFive\riscv-qemu-4.2.0-2020.04.0\bin
为了避免相容性问题,建议安装 FreedomStudio-2020-06-3-win64 版本。
此外,当要运行之後介绍的范例程序时,也请使用 Git-Bash 进行操作:
说了这麽多,来聊聊接下来一周会做些什麽事情吧!
我们将会在这一周学习作业系统的相关知识并且透过阅读开源作业系统的方式了解这些理论是如何转换到实务上的。可能会参考的开源专案有:
mini-riscv-os
由金门大学资工系的陈锺诚老师开发,是一个大约 1000 行规模的作业系统,该专案主要重现了:
我们可以透过这个简易的作业系统了解电脑如何在开机时加载作业系统,是个很棒的教材,从笔者开始编写该系列文到现在,已经尝试并成功贡献了一些原始码到该专案上,我贡献的部分主要包含了:
lib_getc
(方便日後扩充 Shell)保护 Shared data。
处理更多的外部中断,包含: UART IRQ, VirtIO IRQ 等。
原本 mini-riscv-os 仅支援时间中断的处理,我修改了其 Trap Handler 的实作,使其可以处理与辨认不同的中断以及异常状况。
要实作 File system 之前,必须让作业系统可以操作虚拟硬碟上的资料,所以 Device Driver 就非常的重要了。
有了 Device Driver,除了存取硬碟,系统还可以与网路卡、显示卡等外部设备做沟通,不过这就超出笔者目前的能力范围了 XD
因为笔者是 mini-riscv-os 的贡献者之一,所以专案中的中文说明文件会与本系列文的内容相似,请读者们别误会,我绝对没有做出抄袭的行为。
并且,此系列文也有受到陈锺诚老师的鼓励,希望这些文章可以帮助到更多人 : )
xv6 是由 MIT 开发的作业系统,其也被用作教学上,该专案最一开始是基於 x86 开发,随後更发展出可运行在 RISC-V 平台上的版本,xv6 具有完整的档案系统以及系统呼叫,其规模要比 mini-riscv-os 大出 10 倍左右。
在 GitHub 上其实有很多 xv6 作业系统的变形,像是:
<<: 透过写程序可以更熟悉AWS console上的完整操作
>>: 树状结构转线性纪录再转二元树-孩子兄弟标记法 - DAY 15
**制作目标 ** 资料库搜寻 在输入料理搜寻模式後,会让使用者输入料理名称或一项食材,再从资料库里...
欢迎来到 Ian 的知识讲堂,本篇会用说故事的方式跟大家聊聊全端宠儿 - JavaScript 的小...
建立结构化的 Log 系列文章 (1/4) - Elastic Common Schema 结构化 ...
Docker & Docker Compose installation 今天我们就来快速地...
相关距离(Correlation Distance) 相关距离定义: python实现相关系数 im...