merge updates
This commit is contained in:
commit
61d5284699
|
|
@ -37,7 +37,7 @@ si
|
|||
si
|
||||
...
|
||||
```
|
||||
4 此时的`CS=0xf, IP=fff0`,如果想看BIOS的代码
|
||||
4 此时的`CS=0xf000, EIP=0xfff0`,如果想看BIOS的代码
|
||||
```
|
||||
x /2i 0xffff0
|
||||
```
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ kern/mm/pmm.c,实现其功能。请仔细查看和理解get\_pte函数中的
|
|||
图1 get\_pte函数的调用关系图
|
||||
|
||||
请在实验报告中简要说明你的设计实现过程。请回答如下问题:
|
||||
- 请描述页目录项(Pag Director Entry)和页表(Page Table Entry)中每个组成部分的含义和对ucore而言的潜在用处。
|
||||
- 请描述页目录项(Page Directory Entry)和页表项(Page Table Entry)中每个组成部分的含义以及对ucore而言的潜在用处。
|
||||
- 如果ucore执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情?
|
||||
|
||||
**练习3:释放某虚地址所在的页并取消对应二级页表项的映射(需要编程)**
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ npage = maxpa / PGSIZE
|
|||
```
|
||||
这样,我们就可以预估出管理页级物理内存空间所需的Page结构的内存空间所需的内存大小为:
|
||||
```
|
||||
sizeof(struct Page) * npage)
|
||||
sizeof(struct Page) * npage
|
||||
```
|
||||
由于bootloader加载ucore的结束地址(用全局指针变量end记录)以上的空间没有被使用,所以我们可以把end按页大小为边界去整后,作为管理页级物理内存空间所需的Page结构的内存空间,记为:
|
||||
```
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ virt addr = phy addr + 0xC0000000
|
|||
```
|
||||
设一个32bit线性地址la有一个对应的32bit物理地址pa,如果在以la的高10位为索引值的页目录项中的存在位(PTE\_P)为0,表示缺少对应的页表空间,则可通过alloc\_page获得一个空闲物理页给页表,页表起始物理地址是按4096字节对齐的,这样填写页目录项的内容为
|
||||
```
|
||||
页目录项内容 = (页表起始物理地址 &0x0FFF) | PTE_U | PTE_W | PTE_P
|
||||
页目录项内容 = (页表起始物理地址 & ~0x0FFF) | PTE_U | PTE_W | PTE_P
|
||||
```
|
||||
进一步对于页表中以线性地址la的中10位为索引值对应页表项的内容为
|
||||
```
|
||||
|
|
|
|||
|
|
@ -48,8 +48,8 @@ SECTIONS {
|
|||
|
||||
**第三个阶段**从enable_page函数开始,到执行gdt_init函数(在kern/mm/pmm.c中)之前,启动了页映射机制,但没有第三次更新段映射。这时的虚拟地址,线性地址以及物理地址之间的映射关系比较微妙:
|
||||
```
|
||||
lab2 stage 3: virt addr - 0xC0000000 = linear addr = phy addr + 0xC0000000 # 物理地址在0~4MB之外的三者映射关系
|
||||
virt addr - 0xC0000000 = linear addr = phy addr # 物理地址在0~4MB之内的三者映射关系
|
||||
lab2 stage 3: virt addr - 0xC0000000 = linear addr = phy addr + 0xC0000000 # 线性地址在0~4MB之外的三者映射关系
|
||||
virt addr - 0xC0000000 = linear addr = phy addr # 线性地址在0~4MB之内的三者映射关系
|
||||
```
|
||||
请注意`pmm_init`函数中的一条语句:
|
||||
```
|
||||
|
|
|
|||
|
|
@ -45,12 +45,12 @@ boot\_pgdir[PDX(VPT)] = PADDR(boot\_pgdir) | PTE\_P | PTE\_W;
|
|||
|
||||
所以最大内核虚地址KERNTOP的页目录项虚地址为
|
||||
```
|
||||
vpd+0xF8000000/0x400000=0xFAFEB000+0x3E0=0xFAFEB3E0
|
||||
vpd+0xF8000000/0x400000*4=0xFAFEB000+0x3E0*4=0xFAFEBF80
|
||||
```
|
||||
|
||||
最大内核虚地址KERNTOP的页表项虚地址为:
|
||||
```
|
||||
vpt+0xF8000000/0x1000=0xFAC00000+0xF8000=0xFACF8000
|
||||
vpt+0xF8000000/0x1000*4=0xFAC00000+0xF8000*4=0xFAFE0000
|
||||
```
|
||||
|
||||
> 需要注意,页目录项和页表项是4字节对齐的。从上面的设置可以看出KERNTOP/4M后的值是4字节对齐的,所以这样算出来的页目录项和页表项地址的最后两位一定是0。
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ succeeded!”的输出,表示练习1基本正确。
|
|||
|
||||
请在实验报告中简要说明你的设计实现过程。请回答如下问题:
|
||||
|
||||
- 请描述页目录项(Pag Director Entry)和页表(Page Table Entry)中组成部分对ucore实现页替换算法的潜在用处。
|
||||
- 请描述页目录项(Page Directory Entry)和页表项(Page Table Entry)中组成部分对ucore实现页替换算法的潜在用处。
|
||||
- 如果ucore的缺页服务例程在执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情?
|
||||
|
||||
#### 练习2:补充完成基于FIFO的页面替换算法(需要编程)
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ idt_init(void) {
|
|||
extern uintptr_t __vectors[];
|
||||
int i;
|
||||
for (i = 0; i < sizeof(idt) / sizeof(struct gatedesc); i ++) {
|
||||
SETGATE(idt[i], 1, GD_KTEXT, __vectors[i], DPL_KERNEL);
|
||||
SETGATE(idt[i], 0, GD_KTEXT, __vectors[i], DPL_KERNEL);
|
||||
}
|
||||
SETGATE(idt[T_SYSCALL], 1, GD_KTEXT, __vectors[T_SYSCALL], DPL_USER);
|
||||
lidt(&idt_pd);
|
||||
|
|
|
|||
Loading…
Reference in New Issue