一个简易64位操作系统的设计与实现——开发环境搭建
硬件环境
对于不同的硬件环境,会有不同的配置。以下是我所使用的硬件:
- 开发机器:MacBook Pro 16英寸(2019),CPU: i9-9880H,64GB内存
- 目标机器:Raspberry Pi 5,CPU: Broadcom BCM2712,16GB内存
软件环境
编译工具
我的开发机器是MacOS x86_64架构,而目标机器是Arm64架构,因此需要使用交叉编译工具链来编译操作系统。
这里使用的是Arm GNU Toolchain 14.2.rel1
,下载地址在这里。
打开页面会看到很多版本,这里对版本名称说明一下:
AArch64
: 表示这是一个64位的Arm架构工具链,编译产物是 64 位的。AArch32
: 表示这是一个32位的Arm架构工具链,编译产物是 32 位的。bare-metal target
: 表示这是一个针对bare-metal(裸机)
的交叉编译工具链,不包含任何操作系统相关的代码。也就是说,编译出来的代码可以直接运行在裸机上,而不需要依赖任何操作系统。Linux
: 表示这是一个针对Linux操作系统的交叉编译工具链,也就是说你可以直接使用Linux系统调用和头文件。hard float
: 表示这是一个支持硬件浮点运算的交叉编译工具链。硬件浮点运算表示 CPU 包含 FPU(浮点运算单元),可以直接进行浮点运算,而不需要软件模拟。eabi
: 表示这是一个符合EABI标准的交叉编译工具链。elf
: 表示这是一个生成ELF格式的可执行文件的交叉编译工具链。ELF(Executable and Linkable Format)是一种可执行文件格式,广泛用于Unix和类Unix操作系统。
由于我本机安装了brew,因此可以使用以下命令来安装交叉编译工具链:
1 | brew install gcc-aarch64-embedded |
这里的 gcc-aarch64-embedded 是brew平台的包名,可以使用如下命令查看包的详细信息。
1 | brew info gcc-aarch64-embedded |
我在这里犯了一个错误,下载了 Linux
版本。
开机上电以后,还没有进入操作系统,所以没有任何系统相关的操作,所以需要的是裸机版本的交叉编译工具链。不能使用 Linux
版本的交叉编译工具链,而是使用 bare-metal target
版本。
开发工具
我的 JetBrains All Products Pack
订阅在 2025 年 7 月到期了,然后没有续费。
2019 年的 MacBook Pro 16 英寸的配置似乎已经不太支撑 JetBrains 的 IDE 了,打开以后发热严重,电池续航也大幅下降.
所以我决定使用 Vim
做开发工具,最后选择了 Neovim + LazyVim
的组合。
LazyVim 是一个基于 Neovim 的配置框架,提供了很多开箱即用的功能,可以大大提高开发效率。
我现在使用它编写 C
和 C#
代码,感觉非常不错。这里我分享一下我的配置文件,供大家参考。
LazyVim配置
使用 Vim 需要有极大的耐心,因为它的学习曲线非常陡峭,基本都是快捷键操作。但是,当你一旦掌握了它的使用方法,就会发现它的强大和灵活性。
模拟工具
你需要一个模拟器来测试你的操作系统代码。这里用的是模拟器而不是虚拟机,原因在于模拟器可以模拟不同 CPU 架构的硬件,而虚拟机通常只能虚拟化相同 CPU 架构的硬件。这也是模拟器和虚拟机的最大区别。
我选择了一个开源的、功能强大的、跨平台的、支持多种 CPU 架构的老牌模拟器 QEMU
。QEMU 可以模拟多种 CPU 架构,包括 x86_64、Arm、RISC-V 等等。
使用 brew 安装:
1 | brew install qemu |
针对 Raspberry Pi 5(16GB) 的硬件图解
我在 2016 年买过一块 Raspberry Pi 3 model B,用来编写一些硬件相关的程序以及实验一下 MES (Manufacturing Execution System)相关的东西。但那块 Raspberry Pi 3 现在已经不见了。
所以我决定买一块 Raspberry Pi 5 (16GB) 来作为我的操作系统的目标机器。下图是对 Raspberry Pi 5 (16GB) 硬件的图解,主要是为了方便后续的操作系统开发。
通过一些比对,我发现 Pi 5 和 Pi 3 硬件有很大的不同,这些不同也会影响到操作系统的设计和实现,我会在以后的文章中详细介绍这些不同之处。随着硬件性能的提升,Pi 5 的电源功率需求也越来越大,我还购买了一个配套的风扇来帮助散热,长这样。