diff --git a/lab1/lab1_5_appendix.md b/lab1/lab1_5_appendix.md index 65565cf..3568740 100644 --- a/lab1/lab1_5_appendix.md +++ b/lab1/lab1_5_appendix.md @@ -37,7 +37,7 @@ si si ... ``` -4 此时的`CS=0xf, IP=fff0`,如果想看BIOS的代码 +4 此时的`CS=0xf000, EIP=0xfff0`,如果想看BIOS的代码 ``` x /2i 0xffff0 ``` diff --git a/lab2/lab2_3_2_1_phymemlab_exercise.md b/lab2/lab2_3_2_1_phymemlab_exercise.md index 1a5327e..bdeef07 100644 --- a/lab2/lab2_3_2_1_phymemlab_exercise.md +++ b/lab2/lab2_3_2_1_phymemlab_exercise.md @@ -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:释放某虚地址所在的页并取消对应二级页表项的映射(需要编程)** diff --git a/lab2/lab2_3_3_3_phymem_pagelevel.md b/lab2/lab2_3_3_3_phymem_pagelevel.md index 14c335c..0c737f1 100644 --- a/lab2/lab2_3_3_3_phymem_pagelevel.md +++ b/lab2/lab2_3_3_3_phymem_pagelevel.md @@ -52,7 +52,7 @@ npage = maxpa / PGSIZE ``` 这样,我们就可以预估出管理页级物理内存空间所需的Page结构的内存空间所需的内存大小为: ``` -sizeof(struct Page) * npage) +sizeof(struct Page) * npage ``` 由于bootloader加载ucore的结束地址(用全局指针变量end记录)以上的空间没有被使用,所以我们可以把end按页大小为边界去整后,作为管理页级物理内存空间所需的Page结构的内存空间,记为: ``` diff --git a/lab2/lab2_3_3_5_3_setup_paging_map.md b/lab2/lab2_3_3_5_3_setup_paging_map.md index 883da6b..5b9ad82 100644 --- a/lab2/lab2_3_3_5_3_setup_paging_map.md +++ b/lab2/lab2_3_3_5_3_setup_paging_map.md @@ -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位为索引值对应页表项的内容为 ``` diff --git a/lab2/lab2_3_3_5_4_maping_relations.md b/lab2/lab2_3_3_5_4_maping_relations.md index 3f7adf9..d510fd0 100644 --- a/lab2/lab2_3_3_5_4_maping_relations.md +++ b/lab2/lab2_3_3_5_4_maping_relations.md @@ -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`函数中的一条语句: ``` diff --git a/lab2/lab2_3_3_6_self_mapping.md b/lab2/lab2_3_3_6_self_mapping.md index 9cad48b..73e9b6b 100644 --- a/lab2/lab2_3_3_6_self_mapping.md +++ b/lab2/lab2_3_3_6_self_mapping.md @@ -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。 diff --git a/lab3/lab3_2_1_exercises.md b/lab3/lab3_2_1_exercises.md index 8c88723..346866c 100644 --- a/lab3/lab3_2_1_exercises.md +++ b/lab3/lab3_2_1_exercises.md @@ -26,7 +26,7 @@ succeeded!”的输出,表示练习1基本正确。 请在实验报告中简要说明你的设计实现过程。请回答如下问题: - - 请描述页目录项(Pag Director Entry)和页表(Page Table Entry)中组成部分对ucore实现页替换算法的潜在用处。 + - 请描述页目录项(Page Directory Entry)和页表项(Page Table Entry)中组成部分对ucore实现页替换算法的潜在用处。 - 如果ucore的缺页服务例程在执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情? #### 练习2:补充完成基于FIFO的页面替换算法(需要编程) diff --git a/lab5/lab5_3_4_syscall.md b/lab5/lab5_3_4_syscall.md index 3acb8f4..46dc1a2 100644 --- a/lab5/lab5_3_4_syscall.md +++ b/lab5/lab5_3_4_syscall.md @@ -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);