update link of png files
This commit is contained in:
parent
2ce71ad9c9
commit
4c64f8d3db
|
@ -97,6 +97,6 @@ struct pmm_manager {
|
||||||
重点是实现init\_memmap/ alloc\_pages/
|
重点是实现init\_memmap/ alloc\_pages/
|
||||||
free\_pages这三个函数。当完成物理内存页管理初始化工作后,计算机系统的内存布局如下图所示:
|
free\_pages这三个函数。当完成物理内存页管理初始化工作后,计算机系统的内存布局如下图所示:
|
||||||
|
|
||||||
![image](./lab2_figs/image003.png)
|
![](../lab2_figs/image003.png)
|
||||||
图3 计算机系统的内存布局
|
图3 计算机系统的内存布局
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ default\_free\_pages等相关函数。请仔细查看和理解default\_pmm.c中
|
||||||
in
|
in
|
||||||
kern/mm/pmm.c,实现其功能。请仔细查看和理解get\_pte函数中的注释。get\_pte函数的调用关系图如下所示:
|
kern/mm/pmm.c,实现其功能。请仔细查看和理解get\_pte函数中的注释。get\_pte函数的调用关系图如下所示:
|
||||||
|
|
||||||
![image](lab2_figs/image001.png)
|
![](../lab2_figs/image001.png)
|
||||||
图1 get\_pte函数的调用关系图
|
图1 get\_pte函数的调用关系图
|
||||||
|
|
||||||
**练习3:释放某虚地址所在的页并取消对应二级页表项的映射(需要编程)**
|
**练习3:释放某虚地址所在的页并取消对应二级页表项的映射(需要编程)**
|
||||||
|
@ -24,7 +24,7 @@ kern/mm/pmm.c,实现其功能。请仔细查看和理解get\_pte函数中的
|
||||||
当释放一个包含某虚地址的物理内存页时,需要让对应此物理内存页的管理数据结构Page做相关的清除处理,使得此物理内存页成为空闲;另外还需把表示虚地址与物理地址对应关系的二级页表项清除。请仔细查看和理解page\_remove\_pte函数中的注释。为此,需要补全在
|
当释放一个包含某虚地址的物理内存页时,需要让对应此物理内存页的管理数据结构Page做相关的清除处理,使得此物理内存页成为空闲;另外还需把表示虚地址与物理地址对应关系的二级页表项清除。请仔细查看和理解page\_remove\_pte函数中的注释。为此,需要补全在
|
||||||
kern/mm/pmm.c中的page\_remove\_pte函数。page\_remove\_pte函数的调用关系图如下所示:
|
kern/mm/pmm.c中的page\_remove\_pte函数。page\_remove\_pte函数的调用关系图如下所示:
|
||||||
|
|
||||||
![image](lab2_figs/image002.png)
|
![](../lab2_figs/image002.png)
|
||||||
图2 page\_remove\_pte函数的调用关系图
|
图2 page\_remove\_pte函数的调用关系图
|
||||||
|
|
||||||
**扩展练习Challenge:任意大小的内存单元slub分配算法(需要编程)**
|
**扩展练习Challenge:任意大小的内存单元slub分配算法(需要编程)**
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
体系结构将内存地址分成三种:逻辑地址(也称虚地址)、线性地址和物理地址。逻辑地址即是程序指令中使用的地址,物理地址是实际访问内存的地址。逻
|
体系结构将内存地址分成三种:逻辑地址(也称虚地址)、线性地址和物理地址。逻辑地址即是程序指令中使用的地址,物理地址是实际访问内存的地址。逻
|
||||||
辑地址通过段式管理的地址映射可以得到线性地址,线性地址通过页式管理的地址映射得到物理地址。
|
辑地址通过段式管理的地址映射可以得到线性地址,线性地址通过页式管理的地址映射得到物理地址。
|
||||||
|
|
||||||
![image](lab2_figs/image004.png)
|
![](../lab2_figs/image004.png)
|
||||||
图 4 段页式管理总体框架图
|
图 4 段页式管理总体框架图
|
||||||
|
|
||||||
段式管理前一个实验已经讨论过。在 ucore
|
段式管理前一个实验已经讨论过。在 ucore
|
||||||
|
@ -12,11 +12,11 @@
|
||||||
OS 实现也是不加区分的)。对段式管理有兴趣的同学可以参照《Intel® 64 and
|
OS 实现也是不加区分的)。对段式管理有兴趣的同学可以参照《Intel® 64 and
|
||||||
IA-32Architectures Software Developer ’s Manual – Volume 3A》3.2 节。
|
IA-32Architectures Software Developer ’s Manual – Volume 3A》3.2 节。
|
||||||
|
|
||||||
![image](lab2_figs/image005.png)如图5所示,页式管理将线性地址分成三部分(图中的
|
如图5所示,页式管理将线性地址分成三部分(图中的
|
||||||
Linear Address 的 Directory 部分、 Table 部分和 Offset 部分)。ucore
|
Linear Address 的 Directory 部分、 Table 部分和 Offset 部分)。ucore
|
||||||
的页式管理通过一个二级的页表实现。一级页表的起始物理地址存放在 cr3
|
的页式管理通过一个二级的页表实现。一级页表的起始物理地址存放在 cr3
|
||||||
寄存器中,这个地址必须是一个页对齐的地址,也就是低 12 位必须为
|
寄存器中,这个地址必须是一个页对齐的地址,也就是低 12 位必须为
|
||||||
0。目前,ucore 用boot\_cr3(mm/pmm.c)记录这个值。
|
0。目前,ucore 用boot\_cr3(mm/pmm.c)记录这个值。
|
||||||
|
|
||||||
![image](lab2_figs/image006.png)
|
![](../lab2_figs/image006.png)
|
||||||
图 5 分页机制管理
|
图 5 分页机制管理
|
||||||
|
|
|
@ -49,8 +49,7 @@ vpt+0xF8000000/0x1000=0xFAC00000+0xF8000=0xFACF8000
|
||||||
|
|
||||||
在pmm.c中的函数print\_pgdir就是基于ucore的页表自映射方式完成了对整个页目录表和页表的内容扫描和打印。注意,这里不会出现某个页表的虚地址与页目录表虚地址相同的情况。
|
在pmm.c中的函数print\_pgdir就是基于ucore的页表自映射方式完成了对整个页目录表和页表的内容扫描和打印。注意,这里不会出现某个页表的虚地址与页目录表虚地址相同的情况。
|
||||||
|
|
||||||
![image](lab2_figs/image009.png)![image](lab2_figs/image010.png)![image](lab2_figs/image011.png)print
|
print\_pgdir函数使得 ucore 具备和 qemu 的info pg相同的功能,即print pgdir能
|
||||||
pgdir函数使得 ucore 具备和 qemu 的info pg相同的功能,即print pgdir能
|
|
||||||
够从内存中,将当前页表内有效数据(PTE\_P)印出来。拷贝出的格式如下所示:
|
够从内存中,将当前页表内有效数据(PTE\_P)印出来。拷贝出的格式如下所示:
|
||||||
```
|
```
|
||||||
PDE(0e0) c0000000-f8000000 38000000 urw
|
PDE(0e0) c0000000-f8000000 38000000 urw
|
||||||
|
@ -84,9 +83,9 @@ PDE(001) fac00000-fb000000 00400000 -rw
|
||||||
1. PTE 中输出的权限是 PTE 表中的数据给出的,并没有和 PDE
|
1. PTE 中输出的权限是 PTE 表中的数据给出的,并没有和 PDE
|
||||||
表中权限做与运算。
|
表中权限做与运算。
|
||||||
2.
|
2.
|
||||||
![image](lab2_figs/image012.png)整个print\_pgdir函数强调两点:第一是相同权限,第二是连续。
|
整个print\_pgdir函数强调两点:第一是相同权限,第二是连续。
|
||||||
3.
|
3.
|
||||||
![image](lab2_figs/image013.png)print\_pgdir中用到了vpt和vpd两个变量。可以参
|
print\_pgdir中用到了vpt和vpd两个变量。可以参
|
||||||
考VPT和PGADDR两个宏。
|
考VPT和PGADDR两个宏。
|
||||||
|
|
||||||
自映射机制还可方便用户态程序访问页表。因为页表是内核维护的,用户程序很难知道自己页表的映射结构。VPT
|
自映射机制还可方便用户态程序访问页表。因为页表是内核维护的,用户程序很难知道自己页表的映射结构。VPT
|
||||||
|
|
|
@ -81,7 +81,7 @@ pte_t *get_pte (pde_t *pgdir, uintptr_t la, bool create)
|
||||||
```
|
```
|
||||||
下面的调用关系图可以比较好地看出get\_pte在实现上诉流程中的位置:
|
下面的调用关系图可以比较好地看出get\_pte在实现上诉流程中的位置:
|
||||||
|
|
||||||
![image](lab2_figs/image007.png)
|
![](../lab2_figs/image007.png)
|
||||||
图6 get\_pte调用关系图
|
图6 get\_pte调用关系图
|
||||||
|
|
||||||
这里涉及到三个类型pte t、pde t和uintptr
|
这里涉及到三个类型pte t、pde t和uintptr
|
||||||
|
@ -146,11 +146,12 @@ boot_pgdir[0] = boot_pgdir[PDX(KERNBASE)];
|
||||||
就可能导致打开分页之后内核
|
就可能导致打开分页之后内核
|
||||||
crash,在后面的试验中,也的确出现了这种情况。解决方法同样简单,就是拷贝更多的高地址项到低地址。
|
crash,在后面的试验中,也的确出现了这种情况。解决方法同样简单,就是拷贝更多的高地址项到低地址。
|
||||||
|
|
||||||
当执行完毕gdt\_init函数后,新的段页式映射已经建立好了,上面的0\~4MB的线性地址与0\~4MB的物理地址一一映射关系已经没有用了。所以可以通过如下语句解除这个老的映射关系。
|
当执行完毕gdt\_init函数后,新的段页式映射已经建立好了,上面的0\~4MB的线性地址与0\~4MB的物理地址一一映射关系已经没有用了。
|
||||||
|
所以可以通过如下语句解除这个老的映射关系。
|
||||||
```
|
```
|
||||||
boot_pgdir[0] = 0;
|
boot_pgdir[0] = 0;
|
||||||
```
|
```
|
||||||
在page\_init函数建立完实现物理内存一一映射和页目录表自映射的页目录表和页表后,一旦使能分页机制,则ucore看到的内核虚拟地址空间如下图所示:
|
在page\_init函数建立完实现物理内存一一映射和页目录表自映射的页目录表和页表后,一旦使能分页机制,则ucore看到的内核虚拟地址空间如下图所示:
|
||||||
|
|
||||||
![说明: proj5-vm-map](lab2/image008.png)
|
![](../lab2/image008.png)
|
||||||
图7 使能分页机制后的虚拟地址空间图
|
图7 使能分页机制后的虚拟地址空间图
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
Loading…
Reference in New Issue