本文节选自《奔跑吧linux内核 入门篇》第二版第16章
学习操作系统最有效且最具有挑战性的训练是从零开始动手写一个小OS(操作系统)。目前很多国内外知名大学的“操作系统”课程中的实验与动手写一个小OS相关,比如麻省理工学院的操作系统课程采用xv6系统来做实验。xv6是在x86处理器上重新实现的UNIX第6版系统,用于教学目的。清华大学的操作系统课程也采用类似的思路,他们基于xv6的设计思想,通过实验一步一步完善一个小OS——ucore OS。xv6和ucore OS实验都采用类似于英语考试中完形填空的方式来引导大家实现和完善一个小OS。
动手写一个小OS会让我们对计算机底层技术有更深的理解,我们对操作系统中核心功能(比如系统启动、内存管理、进程管理等)的理解也会更深刻。本章介绍了24小实验来引导读者在树莓派上从零开始实现一个小OS,我们把这个OS命名为BenOS。
本章需要准备的实验设备如下。
-
硬件开发平台:树莓派3B或树莓派4B。
-
软件模拟平台:QEMU 4.2。
-
处理器架构:ARMv8架构(aarch64)。
-
开发主机:Ubuntu Linux 20.04。
-
MicroSD卡一张以及读卡器。
-
USB转串口线一根。
-
J-Link仿真器(可选 )。
本章用到的芯片手册如下。
-
《ARM Architecture Reference Manual, ARMv8, for ARMv8-A architecture profile》的v8.4版本。
-
《BCM2837 ARM Peripherals》的v2.1版本,用于树莓派3B。
-
BCM2711芯片手册《BCM2711 ARM Peripherals》的v1版本,用于树莓派4B。
本章的实验按照难易程度分成3个阶段。
-
入门动手篇。一般读者在完成相对容易的5个实验之后,将对ARM64架构、操作系统启动、中断和进程管理有初步的认识。
-
进阶挑战篇。对操作系统有浓厚兴趣以及学有余力的读者可以完成进阶篇的12个实验。这12个实验涉及操作系统最核心的功能,比如物理内存管理、虚拟内存管理、缺页异常处理、进程管理以及进程调度等。
-
高手完善篇。对操作系统有执着追求的读者可以继续完成高手篇的实验,从而一步一步完成一个有一定使用价值的小OS。
本章的所有实验为开放性实验,读者可以根据实际情况选做部分或全部实验。
16.1 实验准备
16.1.1 开发流程
我们的开发平台有两个。
-
软件模拟平台:QEMU虚拟机。
-
硬件开发平台:树莓派3B或树莓派4B。
QEMU虚拟机可以模拟树莓派绝大部分的硬件工具 ,另外使用QEMU内置的GDB调试功能可以很方便地调试和定位问题。我们建议的开发流程如下。
(1)在Ubuntu主机上编写实验代码,然后编译代码。
(2)在QEMU虚拟机上调试并运行代码。
(3)将代码装载到树莓派上运行(可选)。
如果读者手头没有树莓派,那么可以在QEMU虚拟机上完成本章的所有实验。
16.1.2 配置串口线
要在树莓派上运行BenOS实验代码,我们需要一根USB转串口线,这样在系统启动时便可通过串口输出信息来协助调试。读者可从网上商店购买USB转串口线,图16.1所示是某个厂商售卖的一款USB转串口线。串口一般有3根线。另外,串口还有一根额外的电源线(可选)。
-
电源线(红色 ):5V或3.3V电源线(可选)。
-
地线(黑色)。
-
接收线(白色):串口的接收线RXD。
-
发送线(绿色):串口的发送线TXD。
树莓派支持包含40个GPIO引脚的扩展接口,这些扩展接口的定义如图16.2所示。根据扩展接口的定义,我们需要把串口的三根线连接到扩展接口,如图16.3所示。
地线:连接到第6个引脚。
RXD线:连接到第8个引脚。
TXD线:连接到第10个引脚。
图16.2 树莓派扩展接口的定义
图16.3 将串口连接到树莓派扩展接口
读者可以参照实验1-3,在MicroSD卡上安装支持树莓派的操作系统(比如优麒麟Linux 20.04),然后打开串口软件,查看是否有信息输出。在Windows 10操作系统中,你需要在设备管理器里查看串口号,如图16.4所示。你还需要在Windows 10操作系统中安装用于USB转串口的驱动。
图16.4 在设备管理器中查看串口号
插入MicroSD卡到树莓派,接上USB电源,在串口终端软件(如PuTTY或MobaXterm等)中查看是否有输出,如图16.5所示。
图16.5 在串口终端软件中查看是否有输出
16.1.3 寄存器地址
树莓派3B采用的博通BCM2837芯片通过内存映射的方式来访问所有的片内外设。外设的寄存器地址空间为0x3F000000~0x3FFFFFFF。
树莓派4B采用的是博通BCM2711芯片,BCM2711芯片在BCM2837芯片的基础上做了如下改进。
-
CPU内核:使用性能更好的Cortex-A72。采用4核CPU的设计,最高频率可以达到1.5 GHz。
-
L1缓存:32 KB数据缓存,48 KB指令缓存。
-
L2缓存:大小为1 MB。
-
GPU:采用VideoCore VI核心,最高主频可以达到500 MHz。
-
内存:1~4 GB LPDDR4。
-
支持USB 3.0。
BCM2711芯片支持两种地址模式。
-
低地址模式:外设的寄存器地址空间为0xFC000000 ~ 0xFF7FFFFF,通常外设的寄存器基地址为0xFE000000。
-
35位全地址模式:可以支持更大的地址空间。在这种地址模式下,外设的寄存器地址空间为0x47c000000 ~ 0x47FFFFFFF。
树莓派4B默认情况下使用低地址模式。