教练,我想自干作业系统!

前言

写一个 OS 是多麽美好的事,在有限的生命中千万不要遗漏了它。
-- 王佑中博士

笔者在开始撰写本系列文前不曾接触过嵌入式系统开发,也很少触碰 C 语言,不过,在看到 COSCUP 2012 的第一次自干作业系统核心就上手的议程录影後受到不小的冲击。虽然我不像 Jserv 大大能在短短的 20 分钟内自干作业系统。但是,我们也可以透过阅读相关文献以及专案原始码更加了解作业系统这个有趣的学科。

此外,James Bach 说过一段笔者非常喜欢的话,在这边分享给大家:

假如

你能把重要的事做完

别人有看到你在自我学习

别人看到你在学习做事,即使你不确定该怎麽做

你无私地和人分享你所学的东西

你不隐藏你的无知,也不安於你的无知

你尊重别人所知洞悉

你通常知道如何找到你所不知道的东西

你知道如何寻求帮助

你提供对别人的帮助,而且是以他的方式帮他

那麽

没人会在意你的成功是来自自学或是已知的知识

没有会在乎你偶尔的失误

没人会在意你在某个时间不知道某种特定知识

如果你跟笔者一样是个喜欢作业系统但是平常没有在接触 C/C++ 的人,我认为这并不是什麽太严重的问题,毕竟 C 语言就是设计来开发 UNIX 作业系统的,所以在学习作业系统的过程中一定会越发熟练 :D

开发实务

在实务上,我们用来开发的平台可能会与目标平台不同,例如: 在 x86 平台开发 RISC-V 的作业系统,这时候我们就会需要利用 Cross Compiler 去做处理。

专有名词

下文提到了一些系统程序开发的专有名词。

Host

  • Compiler
  • Debugger
  • Editor code
  • Kernel code (target)
  • Editor
  • Host computer

Target

  • Target computer
  • Assembler
  • Linker
  • Lib
  • Cross compiler

Complex program

  • Makefile

  • Linker script

  • Simulator, Emulator, VM

    • Simulator

    单纯用软件去模拟,就好比我们用物件导向写了一个机器人程序,他就算是机器人的 Simulator。

    • Emulator

    Emulator 比其软件模拟,它能够直接/间接的操作硬体,以 QEMU 为例,它就是一个十分接近真实电脑的 Emulator。

    • VM

Debugger

  • Cross debugger

    Cross debugger 用於对 Target 上 application 的除错,就好比 Debugger 与 Host computer 的关系。

  • Kernel debugger

    常见的 Debug 工具: kdb, kgdb, gdb,本系列文也在 gdb 的介绍时提过如何在嵌入式系统开发中使用 gdb。

  • Cross kernel debugger

  • ICE

开发工具/重要概念

GNU Debugger

GNU Debugger,简称 GDB ,是 GNU 软件系统中的除错器,由於其具有可移植的优点,在现今的主流处理器架构与作业系统平台上都可以看见 GDB 的身影。

更多细节请参考 GNU Debugger 一文。

MakeFile

Make 是一套自动化建构软件,它读取名为 Makefile 的档案,并根据使用者输入的命令找到 target 後生成命令转交给 shell 去执行,以生成开发者需要的可执行档案。 不只如此, Make 还具有依赖关系的检查系统,可以帮助开发者高效的进行测试与编译工作。

更多细节请参考 Makefile 一文。

Patch

比较 A 与 B 版本的差异,将其整理出来做成 Patch。

Git

版本控制工具,方便我们处理多人开发时产生的冲突问题。

更多细节请参考 Git那些多人混战的开发经验谈一文。

Memory Layout

Memory Layout

  • Stack: 存放函数的参数、区域变数等。
  • Heap: 一般由程序开发者分配,执行时才会知道配置大小,像是: 常用的动态分配技巧 malloc / newfree / delete

    注意: 其资料结构不是 heap 而是 linked list。

  • BSS: 未初始化的静态变数
  • Data: 全域变数、静态变数
  • Text / Code: 常量字串

Linking

实务上,我们会将写好的 C Code 编译成 *.o 档,再透过 Linker 输出成可执行档案,像是 *.out*.elf 等。在本系列之前的文章中已经向大家介绍过组译器以及连结器、可执行与可链接格式 elf,因此,本篇不再多做介绍。

安装 GNU Toolchain

在正式进入系统程序的教学之前,我们需要安装支援 RISC-V 的编译工具包,才能编译出可运行在 RISC-V Target Machine 的执行档:

  • Linux
    如果你是使用 Linux 系统做开发,可以直接参考 GNU Toolchain 的官方说明。
  • Windows 10
    若你是使用 Windows 10 开发,可以透过上方连结安装由 SiFive 提供的开发工具,它已经内建了 GNU Toolchain for RISC-V。
    安装完成後,请记得将以下路径添加至环境变数:
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 行规模的作业系统,该专案主要重现了:

    • 内文交换
    • 排程演算法
    • Timer Interrupt
    • PLIC 支援
    • Spinlock
    • Block Device Driver
    • Memory Allocator

    我们可以透过这个简易的作业系统了解电脑如何在开机时加载作业系统,是个很棒的教材,从笔者开始编写该系列文到现在,已经尝试并成功贡献了一些原始码到该专案上,我贡献的部分主要包含了:

    • lib_getc (方便日後扩充 Shell)
    • Spinlock

    保护 Shared data。

    • PLIC 支援

    处理更多的外部中断,包含: UART IRQ, VirtIO IRQ 等。

    • Trap Handler 的改良

    原本 mini-riscv-os 仅支援时间中断的处理,我修改了其 Trap Handler 的实作,使其可以处理与辨认不同的中断以及异常状况。

    • 移植 xv6 的 Block Device Driver 实作

    要实作 File system 之前,必须让作业系统可以操作虚拟硬碟上的资料,所以 Device Driver 就非常的重要了。
    有了 Device Driver,除了存取硬碟,系统还可以与网路卡、显示卡等外部设备做沟通,不过这就超出笔者目前的能力范围了 XD

    • Memory Allocator

因为笔者是 mini-riscv-os 的贡献者之一,所以专案中的中文说明文件会与本系列文的内容相似,请读者们别误会,我绝对没有做出抄袭的行为。
并且,此系列文也有受到陈锺诚老师的鼓励,希望这些文章可以帮助到更多人 : )

  • xv6-riscv

    xv6 是由 MIT 开发的作业系统,其也被用作教学上,该专案最一开始是基於 x86 开发,随後更发展出可运行在 RISC-V 平台上的版本,xv6 具有完整的档案系统以及系统呼叫,其规模要比 mini-riscv-os 大出 10 倍左右。

    在 GitHub 上其实有很多 xv6 作业系统的变形,像是:

Reference


<<:  透过写程序可以更熟悉AWS console上的完整操作

>>:  树状结构转线性纪录再转二元树-孩子兄弟标记法 - DAY 15

食谱搜寻系统制作_中

**制作目标 ** 资料库搜寻 在输入料理搜寻模式後,会让使用者输入料理名称或一项食材,再从资料库里...

[小故事]跌破众人眼镜! 聊聊 JavaScript 的封王之路

欢迎来到 Ian 的知识讲堂,本篇会用说故事的方式跟大家聊聊全端宠儿 - JavaScript 的小...

Day4 让我们来 Build 出自己的 NiFi 服务吧

Docker & Docker Compose installation 今天我们就来快速地...

#23 数据中中的特徵相关性(2)

相关距离(Correlation Distance) 相关距离定义: python实现相关系数 im...