发布于
操作系统学习日志 01
前言
鉴于 Linux 作者 Linus Torvalds 最近的一些言论,我觉得自己应该多关注一下操作系统的发展,因此打算学习一下操作系统的一些知识。 操作系统学习日志是我学习操作系统的笔记,主要记录一下自己学习过程中的心得体会。 本系列博客主要参考了《ARM64 体系结构编程与实践》一书,感谢作者的无私奉献。
ARM 架构
ARM 架构从 v1 到 v9 出了很多版本,ARM 总体的体系结构又根据不同应用场景划分为不同的架构,如 ARM Cortex-A、ARM Cortex-M、ARM Cortex-R,它们分别面向性能密集型系统的应用、实时应用和嵌入式应用。
ARM v8 体系结构基础知识
ARMv8 是 ARM 公司发布的第一代支持 64 位处理器的指令集和体系结构。它还兼容上一代 ARM 指令集,因此它也提供了运行 32 位和 64 位应用程序的环境。
ARMv8 体系结构一共有 8 个小版本,从 ARMv8.0 到 ARMv8.7,每个小版本都对体系结构进行小幅度升级和优化,增加了一些新的特性。
采用 ARMv8 架构的常见处理器内核
-
Cortex-A53
-
Cortex-A72
ARMv8 体系结构中的基本概念
-
处理机(Processing Element, PE):在 ARM 公司的官方技术手册中提到的一个概念,把处理器处理事务的过程抽象位处理机。
-
执行状态(execution state):处理器运行时的环境,包括寄存器的位宽、支持的指令集、异常模型、内存管理以及编程模型等。ARMv8 体系结构定义了两个执行状态。
- AArch64:64 位的执行状态。
- 提供 31 个 64 位的通用寄存器。
- 提供 64 位的程序计数(Program Counter, PC)指针寄存器、栈指针(Stack Pointer, SP)寄存器以及异常链接寄存器(Exception Link Register, ELR)。
- 提供 A64 指令集。
- 定义 ARMv8 异常模型,支持 EL0~EL3 这 4 个异常级别。
- 提供 64 位的内存模型。
- 定义一组处理器状态(PSTATE)用来保存 PE 的状态。
- AArch32:32 位的执行状态。
- 提供 13 个 32 位的通用寄存器,再加上 PC 指针寄存器、SP 寄存器、链接寄存器 (Link Register,LR)。
- 支持两套指令集,分别是 A32 和 T32(Thumb 指令集)指令集。
- 支持 ARMv7-A 异常模型,基于 PE 模式并映射到 ARMv8 的异常模型中。
- 提供 32 位的虚拟内存访问机制。
- 定义一组 PSTATE 用来保存 PE 的状态。
-
ARMv8 指令集:ARMv8 体系结构根据不同的执行状态提供不同的指令集的支持。
-
- A64 指令集:运行在 AArch64 状态下,提供 64 位指令集支持。
-
- A32 指令集:运行在 AArch32 状态下,提供 32 位指令集支持。
-
- T32 指令集:运行在 AArch32 状态下,提供 16 位和 32 位指令集支持。
-
系统寄存器命名:在 AArch64 状态下,很多系统寄存器会根据不同的异常等级提供不同的变种寄存器。系统寄存器的使用方法如下。
<register_name>_Elx //最后一个字母 x 可以表示 0、1、2、3
如 SP_EL0 表示在 EL0 下的 SP 寄存器。
A64 指令集
指令集是处理器体系结构设计的重点之一。ARM 公司定义与实现的指令集一直在变化和发展中。ARMv8 体系结构最大的改变是增加了一个新的 64 位的指令集,这是早前 ARM 指令集的有益补充和增强。它可以处理 64 位宽的寄存器和数据并且使用 64 位的指针来访问内存。这个新的指令集称为 A64 指令集,运行在 AArch64 状态下。ARMv8 兼容旧的 32 位指令集——A32 指令集,它运行在 AArch32 状态下。
A64 指令集和 A32 指令集是不兼容的,它们是两套完全不一样的指令集,它们的指令编码是不一样的。需要注意的是,A64 指令集的指令宽度是 32 位,而不是 64 位。
结尾
本篇先大致介绍一下 ARMv8 体系结构下的基本概念,详细的细节可以从参考书籍《ARM64 体系结构编程与实践》的第一章中学习,下一篇记录 BenOS 在 qemu 虚拟机上的运行。