Jos-lab5 (下)
2014-02-23 22:49
351 查看
Exercise 4. Change
Likewise, implement
child process.
@@ -69,7 +69,11 @@ duppage(envid_t envid, unsigned pn)
void *addr = (void *)(pn * PGSIZE);
pte_t pte = uvpt[PGNUM(addr)];
- if ((pte & PTE_W) > 0 || (pte & PTE_COW) > 0) {
+ // LAB 5: Jacky 140223
+ if ((pte & PTE_SHARE) > 0) {
+ if ((r = sys_page_map(0, addr, envid, addr, (pte & PTE_SYSCALL))) < 0)
+ panic("%s,%d failed: %e\n",__func__,__LINE__,r);
+ } else if ((pte & PTE_W) > 0 || (pte & PTE_COW) > 0) {
copy_shared_pages(envid_t child)
{
// LAB 5: Your code here.
+ struct Env *env;
+ int r, i;
+// if ((r = envid2env(child, &env, 1)) < 0)
+// panic("%s() %d failed: %e\n",__func__,__LINE__,r);
+ for (i = 0; i < UTOP; i += PGSIZE) {
+ if ((uvpd[PDX(i)] & PTE_P) && (uvpt[PGNUM(i)] & PTE_P) && ((uvpt[PGNUM(i)
+ if ((r = sys_page_map(0, (void *)i, child, (void *)i, (uvpt[PGNUM
+ return r;
+ }
+ }
Exercise 5. In your kern/trap.c, call
+ // Handle keyboard and serial interrupts.
+ // LAB 5: Your code here.
+ case IRQ_OFFSET + IRQ_KBD:
+ kbd_intr();
+ return;
+ case IRQ_OFFSET + IRQ_SERIAL:
+ serial_intr();
+ return;
duppagein lib/fork.c to follow the new convention. If the page table entry has the
PTE_SHAREbit set, just copy the mapping directly. (You should use
PTE_SYSCALL, not
0xfff, to mask out the relevant bits from the page table entry.
0xfffpicks up the accessed and dirty bits as well.)
Likewise, implement
copy_shared_pagesinlib/spawn.c. It should loop through all page tableentries in the current process (just like
forkdid), copying any page mappings that have the
PTE_SHAREbit set into the
child process.
@@ -69,7 +69,11 @@ duppage(envid_t envid, unsigned pn)
void *addr = (void *)(pn * PGSIZE);
pte_t pte = uvpt[PGNUM(addr)];
- if ((pte & PTE_W) > 0 || (pte & PTE_COW) > 0) {
+ // LAB 5: Jacky 140223
+ if ((pte & PTE_SHARE) > 0) {
+ if ((r = sys_page_map(0, addr, envid, addr, (pte & PTE_SYSCALL))) < 0)
+ panic("%s,%d failed: %e\n",__func__,__LINE__,r);
+ } else if ((pte & PTE_W) > 0 || (pte & PTE_COW) > 0) {
copy_shared_pages(envid_t child)
{
// LAB 5: Your code here.
+ struct Env *env;
+ int r, i;
+// if ((r = envid2env(child, &env, 1)) < 0)
+// panic("%s() %d failed: %e\n",__func__,__LINE__,r);
+ for (i = 0; i < UTOP; i += PGSIZE) {
+ if ((uvpd[PDX(i)] & PTE_P) && (uvpt[PGNUM(i)] & PTE_P) && ((uvpt[PGNUM(i)
+ if ((r = sys_page_map(0, (void *)i, child, (void *)i, (uvpt[PGNUM
+ return r;
+ }
+ }
Exercise 5. In your kern/trap.c, call
kbd_intrto handle trap
IRQ_OFFSET+IRQ_KBDand
serial_intrto handle trap
IRQ_OFFSET+IRQ_SERIAL.
+ // Handle keyboard and serial interrupts.
+ // LAB 5: Your code here.
+ case IRQ_OFFSET + IRQ_KBD:
+ kbd_intr();
+ return;
+ case IRQ_OFFSET + IRQ_SERIAL:
+ serial_intr();
+ return;
相关文章推荐
- 使用OS Watcher监控操作系统
- 什么是Mac OS X?跟Linux有什么区别
- DOS命令全集(一)
- DOS下内存的配置
- 基于SQL Server OS的任务调度机制详解
- DOS下的必备工具
- 解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
- DOS 下的批处理文件
- python使用os模块的os.walk遍历文件夹示例
- DOS命令全集(二)
- php中的filesystem文件系统函数介绍及使用示例
- 开源操作系统和必备工具网站收集
- 如果操作系统是一条狗,那 Linux 就是斗牛犬
- Carbyn:第一款基于HTML5的操作系统浮出水面
- 十大史上最恶心的操作系统
- Mac OS X 背后的故事
- Mac OS X 背后的故事(二)——Linus Torvalds的短视
- Mac OS X 背后的故事(三)Mach之父Avie Tevanian
- Mac OS X 背后的故事(四)—— 政客的跨界