我们找到exception.h,在第153行加入语句,用于检测越界。 is_kernel_vaddr在库文件vaddr.h中,在头文件中加上它: 再进行测试,pass test! 最终结果 其中multi-oom以及rox的三个测试点都没有通过,至今仍然不知道为什么,如果有知道的同学希望能够不吝赐教。 六、总结 限于篇幅,本文分析的详细程度并不及网上以及官方...
is_user_vaddr() // 检查给定的虚拟地址是否是用户虚拟地址 is_kernel_vaddr() // 检查给定的虚拟地址是否是内核虚拟地址 ptov() // 将物理地址转换为内核虚拟地址 vtop() // 将内核虚拟地址转换为物理地址 1. 2. 3. 4. 5. threads/palloc.c palloc_get_page() // 从用户或内核内存池中获取页 1...
* 参考 Pintos 手册 3.1.5 可以利用userprog/pagedir.c和threads/vaddr.h中的函数验证用户提供的指针的有效性 利用pagedir_get_page()函数检查未映射的虚拟内存 利用is_user_vaddr()和is_kernel_vaddr()函数检查指向内核地址空间的指针 使用这些函数来验证给定指针的有效性 0x05 实现的先后顺序(建议) 在你实...
is_user_vaddr() // 检查给定的虚拟地址是否是用户虚拟地址is_kernel_vaddr() // 检查给定的虚拟地址是否是内核虚拟地址ptov() // 将物理地址转换为内核虚拟地址vtop() // 将内核虚拟地址转换为物理地址 threads/palloc.c palloc_get_page() // 从用户或内核内存池中获取页 userprog/pagedir.c pagedir_...
利用is_user_vaddr() 和 is_kernel_vaddr() 函数检查指向内核地址空间的指针 使用这些函数来验证给定指针的有效性 0x05 实现的先后顺序(建议) 在你实现核心功能之前,你无法看到结果。 强烈建议先阅读/理解上面说的内容和 Pintos 手册,设计好结构,然后开始编写。
if(not_present||(is_kernel_vaddr(fault_addr)&&user)) ExitStatus(-1); 来处理页错误。 Task4 在start_process函数中加入 t->FileSelf=filesys_open(token); file_deny_write(t->FileSelf); 其中FileSelf变量是要在struct thread结构中添加的。
static void kernel_thread (thread_func *function, void *aux) { ASSERT (function != NULL); intr_enable (); function (aux); thread_exit (); } 而用户线程, 就是把上面的function(aux)替换成start_process(file_name_), 在这之中我们模拟了中断返回, 跳到用户程序中, 不再返回了, 所以当用户...
=0;if(not_present||(is_kernel_vaddr(fault_addr)&&user))ExitStatus(-1);//if(!not_present&&is_user_vaddr(fault_addr)&&!user)//return;/*Toimplementvirtualmemory,deletetherestofthefunctionbody,andreplaceitwithcodethatbringsinthepagetowhichfault_addrrefers.*/printf("Pagefaultat%p:%serror%spage...
vaddr.h pte.h 进行有关虚拟地址和页映射表操作的函数和宏定义。这个在 project 3 中比较重要,现在可以直 接忽略之。 flags.h 定义了 80x86 中flags寄存器的几个位。可能这个函数没什么太大的作用。 3、devices 文件夹 现在我们来看一下 devices 文件夹下的一些文件。 timer.c timer.h 定义了系统的定时器...
Priority scheduling is the goal of Problem 1-3. */ tid_t thread_create (const char *name, int priority, thread_func *function, void *aux) { struct thread *t; struct kernel_thread_frame *kf; struct switch_entry_frame *ef; struct switch_threads_frame *sf; tid_t tid; ...