Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/thysrael/thyos
基于 Armv7 的 MOS(北航操作系统课设系统)的移植项目,lab0-6 均全部移植,并增加了增强型 shell。
https://github.com/thysrael/thyos
Last synced: 2 months ago
JSON representation
基于 Armv7 的 MOS(北航操作系统课设系统)的移植项目,lab0-6 均全部移植,并增加了增强型 shell。
- Host: GitHub
- URL: https://github.com/thysrael/thyos
- Owner: Thysrael
- Created: 2022-06-19T08:49:33.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2024-01-10T13:48:56.000Z (about 1 year ago)
- Last Synced: 2024-05-13T13:34:52.468Z (9 months ago)
- Language: C
- Homepage: https://thysrael.github.io/posts/5955f5d7/
- Size: 7.74 MB
- Stars: 8
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## 提交规则
如果需要做出修改,请另外开出一个分支进行,不要在 `master` 分支上进行修改,分支的命名方式如下
```bash
修改人名称缩写-修改内容
```比如说 thysrael 修改了暴露内核的部分,则分支名应该为
```bash
ts-修改了暴露内核
```最后的合并到 `master` 的工作由 thysrael 完成。
## 通用寄存器
一共有 `X0 ~ X30` 31 个通用寄存器。更加详细的内容可以见这个网站 https://www.csdn.net/tags/MtTaggysMTg4NzQtYmxvZwO0O0OO0O0O.html
### 与函数相关
`X0 - X7` 对应 8 个参数,同时 `X0` 还对应返回值。
### 恢复现场
我们约定 `X16, X17` 是恢复现场专用的寄存器,其地位类似于 `MIPS` 中的 `k0, k1` 。其原理似乎是编译器不会使用这两个寄存器。
### 返回地址
`x30` 是专用的返回地址寄存器,所有其又被称为 `ldr` ,其地位相似与 `MIPS` 中的 `ra`。
### 调用者保存和被调用者保存
`X9 ~ X15` 是调用者保存寄存器,所以需要调用者进行保存和恢复,类似于 `MIPS` 中的 `t` 寄存器。
`X19 ~ X29` 是被调用者保存寄存器,所以需要被调用者进行保存和恢复,类似于 `MIPS` 中的 `s` 寄存器。
## 特殊寄存器
### SCR
异常等级为 3 的时候的配置寄存器,具体的参数如下
```c
// 这位与安全内存有关,但是我不知道啥意思
#define SCR_NS 1
// 这位置 1 说明是 Arch64 而置 0 说明是 Arch32
#define SCR_RW (1 << 10)
```更加详细的可以参照白书的 P144 页。
### HCR
异常等级为 2 的时候的配置寄存器,具体参数如下
```c
#define HCR_RW (1 << 31)
// SWIO hardwired on Pi3, 我不知达到哦啥意思
#define HCR_SWIO (1 << 1)
```更加详细的可以参照白书的 P144 页。
### SPSR
**Saved Process Status Register**。armv8 应该会维护一个状态寄存器 PSTATE ,当发生异常的时候,会把状态寄存器的值存储到 SPSR 当中。当异常返回的时候,会把 SPSR 的值拷贝到 PSTATE 中。我个人感觉已经可以把二者划等号了。
具体参数如下
```c
// 对应 [9:6] DAIF 意思是关闭中断
#define SPSR_MASK_ALL (15 << 6)
// 对应 [3:0] 设置异常返回哪一个等级,我不知道具体的对应规则
#define SPSR_EL2H (9 << 0)
#define SPSR_EL1H (5 << 0)
```另外可以分开访问,比如说 `daifset` 指的就是 SPSR 的 `[9:6]` 位。
### SCTLR
系统控制寄存器,指导书给出了完整配置。
### TCR
**Translation Control Register** 翻译控制寄存器,用于控制 TLB 的行为。具体的配置如下
```c
#define TCR_IGNORE1 (1 << 38)
#define TCR_IGNORE0 (1 << 37)
// 内部共享 TTBR1_EL1
#define TCR_ISH1 (3 << 28)
// 内部共享 TTBR0_EL1
#define TCR_ISH0 (3 << 12)
// TTBR1_EL1 外写通达可缓存
#define TCR_OWT (2 << 26)
// TTBR1_EL1 内写通达可缓存
#define TCR_IWT (2 << 24)
// 25 位掩码
#define TCR_T0SZ (25)
#define TCR_T1SZ (25 << 16)
// TG2 的页面是 4K
#define TCR_TG0_4K (0 << 14)
// TG1 的页面是 4K
#define TCR_TG1_4K (0 << 30)
```### TTBR
一级页表的起始地址存储在这里。
### FAR
far 寄存器里存的就是 BADDR。
### ESR
esr 寄存器就是同步异常的错误原因,类似与 MOS 中的 Cause。可以在 P150 查到
## MMIO
具体的文档可见该网址:https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2836/QA7_rev3.4.pdf
## 内存地址布局
### 内核内存空间
![请添加图片描述](https://img-blog.csdnimg.cn/61b903e4948f4cda9aa20496f6609690.png)
### 用户地址空间
![请添加图片描述](https://img-blog.csdnimg.cn/c97ca22592d7443bb12b1b3cf8df24b7.png)