updates to memory management

pull/1/head
Zhiyuan Shao 4 years ago
parent 59d384bf5b
commit b2f0e183da

@ -6,7 +6,7 @@
**4.1.1 练习一OS内存的初始化过程**
****"pk/mmap.c"内有 pk_vm_init()函数阅读该函数了解OS内存初始化的过程。
在"pk/mmap.c"内有 pk_vm_init()函数阅读该函数了解OS内存初始化的过程。
```
364 uintptr_t pk_vm_init()
@ -47,9 +47,7 @@
391 }
```
以上代码中我们给出了大体的注释请根据以上代码尝试画出RISCV的物理内存结构图。
以上代码中我们给出了大体的注释请根据以上代码读者可以尝试画一下PK的逻辑地址空间结构图以及逻辑地址空间到物理地址空间的映射关系。
**4.1.2 练习二first_fit内存页分配算法需要编程**
@ -108,22 +106,22 @@ Score: 20/20
### 4.2 基础知识
**4.2.1 物理内存空间与空间编址**
**4.2.1 物理内存空间与编址**
计算机的存储结构可以抽象的看做由N个连续的字节组成的数组。想一想在数组中我们如何找到一个元素对了是下标那么我们如何在内存中如何找打一个元素呢自然也是下标。这个下标的起始位置和位数由机器本身决定我们称之为“物理地址”。
在riscv中内存地址是从0x80000000 开始的。在pke的连接文件pke.lds中我们可以看到这样两行
至于物理内存的大小由于我们的RISC-V目标机也就是我们的pke以及app运行的环境是由spike模拟器构造的构造过程中可以通过命令行的-m选项来指定物理内存的大小。而且spike会将目标机的物理内存地址从0x8000-0000开始编制。例如如果物理内存空间的大小为2GBspike的默认值则目标机的物理地址范围为[0x8000-0000, 0x10000-0000]其中0x10000-0000已经超过32位能够表达的范围了但是我们目标机是64位机再例如如果目标机物理内存空间大小为1GB启动spike时带入-m1024m参数则目标机的物理地址范围为[0x8000-0000, 0xC000-0000]。在以下的讨论中我们用符号PHYMEM_TOP代表物理内存空间的高地址部分在以上的两个例子中PHYMEM_TOP分别为0x10000-0000和0xC000-0000。在定义了PHYMEM_TOP符号后物理内存的范围就可以表示为[0x8000-0000, PHYMEM_TOP]。
我们的PK内核的逻辑编址可以通过查看pke.lds得知pke.lds有以下规则
```
14 /* Begining of code and text segment */
15 . = 0x80000000;
```
至于内存的大小,还记得实验二中的-m选项吗spike模拟器可以通过-m选项配置物理内存的大小。
现在思考一下问题首先为什么需要物理内存的管理这个问题可以用另一个问题回答当程序如malloc申请一段内存空间的时候你如何准确的给出一片符合大小要求的且安全可用的内存空间。
可见PK内核的逻辑地址的起始也是0x8000-0000这也就意味着PK内核实际上采用的是直接地址映射的办法保证在未打开分页情况下逻辑地址到物理地址的映射的。代理内核的本质也是一段程序他本身是需要内存空间的而这一段空间在PK的设计中是静态分配给内核使用的不能被再分配给任何应用。那么静态分配给代理内核的内存空间具体是哪一段内存区域呢
其次,我们现在管理的可用内存是那一部分? 代理内核的本质也是一段程序他本身是需要内存空间的而这一段空间自然不能再被分配。除去内核本身占的空间内核可支配的物理空间从0x80016000开始大小在PKE设定为8M2048个页面故而供内核支配的的内存的范围为first_free_page~first_free_paddr。如下图所示。
通过阅读PK的代码我们可知PK内核占据了以下这一段
```
KERNTOP------->+---------------------------------+ 0x80816000
@ -131,31 +129,26 @@ Score: 20/20
| Kern Physical Memory |
| | 8M 2048pages
(first_free_page)| |
KERNBSE -----> +---------------------------------+ 0x80016000
DRAM_BASE----> +---------------------------------+ 0x80016000
| Kern Text/Data/BBS |
KERN------>+---------------------------------+ 0x80000000
```
再往上便是我们可以支配的空间了KERNTOP~Top Memory
也就是说,[0x8000-0000, 0x8081-6000]这段物理内存空间是被PK内核所“保留”的余下的物理内存空间为[0x8081-6000PHYMEM_TOP]也就是下图中的Empty Memory*)部分,这部分内存将会是我们的操作系统需要真正用于动态分配(给应用程序)的空间,**而本实验就是要管理这部分物理内存空间**。
```
kernel/user
4G ------------> +-------------------------------------------------+
PHYMEM_TOP ----> +-------------------------------------------------+
| |
| Empty Memory (*) |
| |
Top Memmory ---> +-------------------------------------------------+ 随物理内存大小移动
| |
| User Remapped Memory |
KERNTOP ---> +-------------------------------------------------+ 0x80816000
(first_free_paddr)| |
| PK kernel resevered |
| |
| |
first_free_paddr->+-------------------------------------------------+ 0x80816000
KERN ----> +-------------------------------------------------+ 0x80000000
```
最后我们来看物理内存分配的单位操作系统中物理页是物理内存分配的基本单位。一个物理页的大小是4KB我们使用结构体Page来表示其结构如图
```
@ -194,12 +187,9 @@ Page结构体对应着物理页我们来看Page结构体同物理地址之间
<img src="pictures/fig4_2.png" alt="fig4_2" style="zoom:80%;" />
**3.2.2** **中断的处理过程**
考虑一下,当程序执行到中断之前程序是有自己的运行状态的例如寄存器里保持的上下文数据。当中断发生硬件在自动设置完中断原因和中断地址后就会调转到中断处理程序而中断处理程序同样会使用寄存器于是当程序从中断处理程序返回时需要保存需要被调用者保存的寄存器我们称之为callee-saved寄存器。
当程序执行到中断之前程序是有自己的运行状态的例如寄存器里保持的上下文数据。当中断发生硬件在自动设置完中断原因和中断地址后就会调转到中断处理程序而中断处理程序同样会使用寄存器于是当程序从中断处理程序返回时需要保存需要被调用者保存的寄存器我们称之为callee-saved寄存器。
在PK的machine/minit.c中间中便通过delegate_traps()将部分中断及同步异常委托给S模式。同学们可以查看具体是哪些中断及同步异常

@ -82,8 +82,6 @@ running app4_2 : OK
为了解决上述问题,操作系统引入了虚拟地址的概念。每个进程拥有着独立的虚拟地址空间,这个空间是连续的,一个虚拟页可以映射到不同或者相同的物理页。这就是我们所说的虚拟地址。在程序中,我们所使用的变量的地址均为虚拟地址。
**5.2.2 虚拟地址同物理地址之间的转换**
虚拟地址只是一个逻辑上的概念在计算机中最后正真被访问的地址仍是物理地址。所以我们需要在一个虚拟地址访问内存之前将它翻译成物理地址这个过程称为地址翻译。CPU上的内存管理单元MMU会利用存放在主存的页表完成这一过程。
@ -230,9 +228,7 @@ running app4_2 : OK
245 }
```
对于一个没有对应物理地址的虚拟地址我们需要进行如下的处理。首先找到该物理地址所对应的pte这里你可能会使用到__walk函数__walk中调用了上文中我们讨论过的__walk_internal函数对于一个给定的虚拟地址返回其对于的pte其定义如下
对于一个没有对应物理地址的虚拟地址我们需要进行如下的处理。首先找到该物理地址所对应的pte这里你可能会使用到__walk函数__walk中调用了上文中我们讨论过的__walk_internal函数对于一个给定的虚拟地址返回其对于的pte其定义如下
```
138 pte_t* __walk(uintptr_t addr)

Loading…
Cancel
Save