Skip to content

Commit 6b9507f

Browse files
committed
2023/4/7
1 parent d99168c commit 6b9507f

File tree

7 files changed

+365
-0
lines changed

7 files changed

+365
-0
lines changed

RISC-V/RISC-V Tutorial.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
## RISC-V syscall
2+
3+
exit is syscall 93
4+
5+
write is syscall 64
6+
7+
8+
9+
* 精简指令集
10+
11+
* 扩展
12+
13+
* 模块化
14+
15+
如果软件需要使用拓展的指令,RISC-V硬件会在软件中___捕获___并执行需要的功能,作为标准库的一部分。
16+
17+
* 定制化
18+
19+
20+
21+
22+
23+
![s](./../picture/image-20230306215923787.png)
24+
25+
* 板子拿给你,根据自己的使用场景可以随心所欲地添加自定义指令。
26+
27+
28+
29+
用似定长的变长指令集。
30+
31+
* 大多数时候是4字节定长指令
32+
* 通过模块化拓展支持变长指令(同时实现隔离)
33+
34+
35+
36+
### 什么是架构和具体实现的分离???
37+
38+
简单来说就是将系统架构的各部分分离开单独进行开发。可以看看Linux的不同子系统。
39+
40+
41+

RISC-V/体系结构编程_1.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
## 路程图
2+
3+
<img src="./../picture/image-20230321214217842.png" alt="image-20230321214217842" style="zoom: 50%;" />
4+
5+
6+
7+
8+
9+
## RISC-V体系结构介绍
10+
11+
### 指令集拓展
12+
13+
最小指令集合: RV32I, RV64I
14+
15+
根据功能需要选择对应的拓展,确保指令集的简洁。
16+
17+
### 基本概念
18+
19+
#### 执行环境接口(EEI)
20+
21+
> 包括程序的初始状态、CPU的类型与数量、支持的S模式、内存和I/O的可访问性与属性、每个CPU上执行指令的行为以及异常的处理等
22+
23+
一个EEI可由纯硬件、纯软件或软硬件结合实现
24+
25+
![image-20230321220029429](./../picture/image-20230321220029429.png)
26+
27+
#### 哈特
28+
29+
> 表示一个CPU的执行线程。
30+
31+
近似于x86的SMT(超线程),Arm中的PE(处理机)
32+
33+
~~现目前市面上的处理器只需要了解一个物理核就一个执行线程(哈特),技术上并未实现超线程~~
34+
35+
#### 处理器模式
36+
37+
1. M 机器模式 SBI固件
38+
2. S 特权模式 OS内核
39+
3. U 用户模式
40+
41+
#### SBI服务
42+
43+
> 硬件共性功能的抽象。
44+
45+
就是对硬件的抽象和提供接口服务。类似于系统调用。
46+
47+
### 通用寄存器
48+
49+
| 通用寄存器 | 别名 | 特殊用途 |
50+
| :--: | :--: | :--- |
51+
| x0 | zero | 源寄存器/目标寄存器 |
52+
| x1 | ra | 链接寄存器,保持函数返回地址 |
53+
| x2 | sp | 栈帧寄存器,指向栈的地址 |
54+
| x3 | gp | 全局寄存器,松弛链接优化 |
55+
| x4 | tp | 线程寄存器,存放指向task_struct的指针 |
56+
| x5~x7 | t0~t6 | 临时寄存器 |
57+
| x8~x9 | s0~s11 | 函数调用如使用到需要保存到栈里;s0可作栈指针 |
58+
| x10~x17 | a0~a7 | 函数调用时传递参数和返回值 |
59+
60+
### 系统寄存器
61+
62+
1. M模式的系统寄存器
63+
2. S模式的系统寄存器
64+
3. U模式的系统寄存器
65+
66+
通过CSR指令访问系统寄存器
67+
68+
![image-20230322153900597](./../picture/image-20230322153900597.png)
69+
70+
触发非法指令异常的操作:
71+
72+
1. 访问不存在/未实现
73+
2. 写入只读
74+
3. 越级访问
75+
76+
### 图片来源
77+
1. [RISC-V体系结构编程与实践](https://www.bilibili.com/video/BV1fT411d71G/?spm_id_from=333.999.0.0)
78+
2. [RISC-V Privileged Architecture](https://ica123.com/archives/5717)

RISC-V/体系结构编程_2.md

Whitespace-only changes.

RISC-V/学习计划.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<img src="./../picture/image-20230321214217842.png" alt="image-20230321214217842" style="zoom: 50%;" />
2+
3+
# 自学risc-v系统结构
4+
5+
前提条件:要求有基本计算机组成原理,计算机系统结构基础。
6+
7+
阅读《计算机组成与设计(RISC-V版)》第一、二章,可以在整体结构上对 RISC-V 体系建立基本认知。再进行后面的学习比较有效果。
8+
9+
#### 自学材料和练习要求:
10+
11+
1. 阅读书籍和在线课程
12+
13+
- 自学[PPT for RISC-V特权指令级架构](https://content.riscv.org/wp-content/uploads/2018/05/riscv-privileged-BCN.v7-2.pdf)
14+
- 自学[RISC-V手册:一本开源指令集的指南](http://riscvbook.com/chinese/RISC-V-Reader-Chinese-v2p1.pdf) 重点是第10章
15+
- (Option)自学[RIS-V特权指令级规范](https://riscv.org/technical/specifications/) 重点是与OS相关的特权硬件访问的规范内容(Privileged Spec)
16+
- (Option)自学[RISC-V汇编手册](https://github.com/riscv-non-isa/riscv-asm-manual/blob/master/riscv-asm.md)
17+
- (Option)[计算机组成与设计:RISC-V 教材](https://item.jd.com/12887758.html) 这是完整的课程教材,不要求全部看完,请根据自己的需求选择。
18+
- (Option)[计算机组成与设计:RISC-V 浙大在线课程](http://www.icourse163.org/course/ZJU-1452997167) 这是完整的一门课,不要求全部看完,请根据自己的需求选择。
19+
20+
2. 其他参考学习信息
21+
22+
- (Option)[Berkeley CS61C: Great Ideas in Computer Architecture (Machine Structures)](http://www-inst.eecs.berkeley.edu/~cs61c/sp18/)
23+
24+
> Option的含义是:如果有足够的时间建议看看,否则在后续要用到时或需要查询进一步信息时再查阅这些内容。
25+
26+

X86/01.md

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
## 总线周期
2+
3+
cpu通过总线与存储器、i/o交换一个数据所需要的时间
4+
5+
![image-20230318225812400](./../picture/image-20230318225812400-1679211797512-1.png)
6+
7+
---
8+
9+
## 32位微处理器的工作模式
10+
11+
* 实模式
12+
* 保护模式
13+
* 虚拟8086模式
14+
15+
### 实模式与保护模式
16+
17+
逻辑地址(虚拟地址或编程地址)到物理地址的转换只__分段__就是实模式;
18+
19+
> 线性地址: 逻辑地址经过分段转化就是线性地址。
20+
21+
![image-20230318230406323](./../picture/image-20230318230406323-1679211797512-2.png)
22+
23+
而保护模式先__分段__,再__分页__
24+
25+
如上图,在实模式下线性地址就是物理地址,保护模式下还需要对线性地址进行分页得到物理地址。
26+
27+
#### 特点
28+
29+
实模式下段寄存器存放___段基址___
30+
31+
保护模式下段寄存器存放___段选择符___
32+
33+
保护模式下支持多任务操作系统
34+
35+
### 虚拟8086模式
36+
37+
该模式是__保护模式__下的一种特殊工作模式,可运行实模式程序。
38+
39+
486可以分时运行多个实模式程序,因为在此模式下486认为段寄存器存放的是__段基址__而非段选择符。
40+
41+
---
42+
43+
## 保护机制
44+
45+
系统定义4个特权级
46+
47+
![image-20230319210815260](./../picture/image-20230319210815260.png)
48+
49+
50+
51+
---
52+
53+
![image-20230319230925509](./../picture/image-20230319230925509.png)
54+
55+
![image-20230319230930595](./../picture/image-20230319230930595.png)
56+
57+
---
58+
59+
## 启动
60+
61+
电源打开时,先加电自检(POST),后寻找启动盘,发现以0xAA55结束说明是引导扇区,BIOS将这512字节的引导扇区内容转载到内存地址0000:7c00并在此转交控制权给引导代码,到此计算机变成由操作系统的一部分控制。
62+
63+
### movx
64+
65+
``` asm
66+
movx source, destination
67+
```
68+
69+
movx其中 x 可以是下面的字符:
70+
71+
* l用于32位的长字值
72+
73+
* w用于16位的字值
74+
75+
* b用于8位的字节值
76+
77+
实例:
78+
79+
```asm
80+
movl %eax, %ebx #把32位的EAX寄存器值传送给32位的EBX寄存器值
81+
movw %ax, %bx #把16位的EAX寄存器值传送给16位的EBX寄存器值
82+
movb %al, %lx #把8位的EAX寄存器值传送给8位的EBX寄存器值
83+
```
84+
85+
86+
87+
### andl
88+
89+
假定以下值存储在指示的存储器地址和寄存器中:
90+
91+
![enter image description here](./../picture/WVGoy.png)
92+
93+
现在,我们有一条指令:
94+
95+
``` asm
96+
addl %ecx, (%eax)
97+
```
98+
99+
EAX包含0x100; 0x100中的值为0xFF; ECX包含0x1。
100+
101+
0x1 + 0xFF = 0x100。
102+
103+
然后将最终结果放入EAX指向的地址。 因此,(0X100) == 0x100
104+
105+
### 解析
106+
107+
ESP point to the bottom
108+
109+
value of EAX == -8192
110+
111+
EAX == -8192 + value of ESP
112+
113+
114+

操作系统/uCore.md

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# uCore 和 rCore的阅读笔记
2+
3+
## 应用程序与基本执行环境
4+
5+
系统的链接脚本(kernel.ld)决定了elf程序的内存地址的虚拟映射,__程序中的绝对地址在链接时确定__。我们需要把系统放置在物理地址0x80200000处,需要进行这步操作的原因是在这个运行时刚进入S态,并没有激活虚存机制。~~我还不知道为什么是这个地址~~
6+
7+
啊啊啊啊啊啊啊啊啊啊啊啊汇编好难难难难难难难难难难啊啊啊啊啊啊啊啊啊啊啊
8+
9+
### entry.s
10+
11+
``` assembly
12+
.section .text.entry #在下一个新的部分结束,即.section .bss.stack
13+
.globl _entry #声明全局符号_entry
14+
_entry:
15+
la sp, boot_stack_top # (sp) = (boot_stack_top)
16+
call main # 调用main函数,进入Cの世界 ^_^
17+
18+
.section .bss.stack
19+
.globl boot_stack
20+
boot_stack:
21+
.space 4096 * 16 # 2^16B == 4KB * 16 == 64KB
22+
# 定义堆栈空间大小需要满足大小是4KB的整数倍。
23+
.globl boot_stack_top
24+
boot_stack_top:
25+
26+
```
27+
28+
这是chatgpt的回答
29+
30+
> 这是一个汇编语言源文件,可以作为可执行程序的启动代码。下面是逐行解释:
31+
>
32+
> 1. `.section .text.entry`: 这行代码表示将下面的代码放置在名为 ".text.entry" 的代码段中。
33+
> 2. `.globl _entry`: 这行代码定义了一个全局符号 "_entry",该符号是程序的入口点,在程序启动时执行。
34+
> 3. `_entry:`: 这行代码是 _entry 符号的标签,代表程序的入口点。
35+
> 4. `la sp, boot_stack_top`: 这行代码使用 la 命令生成代码,将 boot_stack_top 符号的地址加载到 sp 寄存器中,将栈指针设置为堆栈的顶部。
36+
> 5. `call main`: 这行代码通过 call 指令调用名为 "main" 的函数。
37+
> 6. `.section .bss.stack`: 这行代码将下面的代码放置在名为 ".bss.stack" 的未初始化数据段中。
38+
> 7. `.globl boot_stack`: 这行代码定义了一个全局符号 "boot_stack",用于表示堆栈的起始位置。
39+
> 8. `boot_stack:`: 这行代码是 boot_stack 符号的标签,表示变量存储在此处。
40+
> 9. `.space 4096 * 16`: 这行代码使用 space 命令在内存中分配 4096 * 16 字节的空间。这是堆栈的空间大小。
41+
> 10. `.globl boot_stack_top`: 这行代码定义了一个全局符号 "boot_stack_top",该符号用于表示堆栈的顶部位置,即栈指针初始值。
42+
> 11. `boot_stack_top:`: 这行代码是 boot_stack_top 符号的标签,表示指针存储在此处。
43+
44+
#### 小知识点
45+
46+
* `.globl`是什么?
47+
48+
`.globl`指示符表示一个全局符号/标签;例:`.globl _entry`: 这行代码定义了一个全局符号 "_entry"
49+
50+
* 以下代码中`la`是什么意思?
51+
52+
``` assembly
53+
la sp, boot_stack_top # (sp) = (boot_stack_top)
54+
```
55+
56+
"la"是RISC-V指令集中的一个伪指令(pseudo-instruction),它的全称为“load address”,通常用于将地址加载到寄存器中。
57+
58+
下面是"la"伪指令的语法格式:
59+
60+
```assembly
61+
la rd, symbol
62+
```
63+
64+
其中,"rd"表示目标寄存器,"symbol"表示要加载的地址符号。
65+
66+
例如,下面的代码将符号"array"的地址加载到寄存器x1中:
67+
68+
```assembly
69+
la x1, array
70+
```
71+
72+
当汇编器处理这个伪指令时,它将使用类似于以下实际指令的指令序列来替代它:
73+
74+
```assembly
75+
auipc x1, %pcrel_hi(array)
76+
addi x1, x1, %pcrel_lo(array)
77+
```
78+
79+
这个指令序列使用了两个新的伪指令:%pcrel_hi和%pcrel_lo。这两个伪指令用于计算符号的高位和低位偏移,在这个例子中,将符号"array"的地址作为立即数加载到寄存器x1中。
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
1. https://gitlab.eduxiji.net/retrhelo/xv6-k210
2+
2. https://gitlab.eduxiji.net/HappyEric/oskernel2021-404
3+
3. https://gitlab.eduxiji.net/calvinxu17/oskernel2021-LinanOS
4+
4. https://gitlab.eduxiji.net/iPear/syscore
5+
5. https://gitlab.eduxiji.net/Ruanzhihan/rwos
6+
6. https://gitlab.eduxiji.net/ckf104/test_commit
7+
7. https://gitlab.eduxiji.net/deng19992008/openbhos
8+
8. https://gitlab.eduxiji.net/Misure/oskernel2021-x2
9+
9. https://gitlab.eduxiji.net/AaronWu/oskernel2021-x
10+
10. https://gitlab.eduxiji.net/buaawyk2/oskernel2021-too_low
11+
11. https://gitlab.eduxiji.net/qq976243638/xos
12+
12. __https://gitlab.eduxiji.net/hzc1998/oskernel2021-xbook2__
13+
13. __https://gitlab.eduxiji.net/zhanghr/os__
14+
14. https://gitlab.eduxiji.net/chino/chinos
15+
15. https://gitlab.eduxiji.net/pagefault/oskernel2021-pagefaultos
16+
16. https://gitlab.eduxiji.net/Deadpool/project325618-47064
17+
17. ___https://gitlab.eduxiji.net/NelsonCheung/project325618-87937___
18+
18.
19+
20+
21+
22+
---
23+
24+
1. https://gitlab.eduxiji.net/Ruanzhihan/rwos
25+
2. https://gitlab.eduxiji.net/Misure/oskernel2021-x2 资料
26+
3. https://gitlab.eduxiji.net/zhanghr/os 文档
27+
4.

0 commit comments

Comments
 (0)