6.828 lab5 File system, Spawn and Shell
Contents
Exercise 1
i385_init 通过给 env_create 传递 ENV_TYPE_FS 类型参数来标识文件系统环境,修改 env_create 使得文件系统环境拥有 I/O 权限,IO 权限由 EFLAGS 寄存器的 IOPL 位设定
Question 1
你需要做什么来保证环境切换时 io 权限设定能够正常保存和恢复吗? 不需要,因为 io 权限保存才 eflags 寄存器中,环境切换是会保存其信息
Exercise 2
实现 bc_pgfault 和 flush_block 函数,bc_pgfault 是一个 page_fault_handler,和 copy-on-write fork 那里一样,如果在内存中读取产生页错误,调用 bc_pgfault 从磁盘中读取。要注意 addr 需要按 block 的大小进行对齐,另外 ide_read 读取的单位是 sectors, 不是 blocks. flush_block 将从某个虚地址开始的一个 block 写进磁盘,如果这个 block 没有被映射到磁盘或者这个 block 不是 dirty 的话就什么都不做。我们可以通过 uvpt 的 PTE_D 这个位来判断是否需要将这个 block 写进磁盘,一旦写入磁盘我们需要重置 PTE_D
Exercise 3
用 free_block 作为参考来实现 alloc_block, 功能是从 bitmap 中找到一个 free 的 disk block, 然后将它标记为已使用,返回这个 block 的编号,一旦分配了 block,就需要立即将 bitmap 所在的 block 刷进磁盘来保证文件系统的一致性。
Exercise 4
实现 file_block_walk() 和 file_get_block,file_block_walk() 用来将 block 的偏移映射到 struct File 中的指针或者是 inderect block(二级映射), file_get_block 将其映射到磁盘。
Exercise 5
实现 serve_read(), 可以用已经实现了的 file_read() 来完成
Exercise 6
实现 serve_write 和 devfile_write
Exercise 7
spawn 依赖于 sys_env_set_trapframe 系统调用,实现 sys_env_set_trapframe
Exercise 8
修改 lib/fork.c 中的 duppage,如果是 PTE_SHATE 时,直接拷贝映射,并使用 PTE_SYSCALL 来设置相关位
实现 copy_shared_pages, 遍历所有的页表项,将是 PTE_SHARE 的项拷贝到子环境
Exercise 9
实现键盘中断
Exercise 10
实现 shell 的 io 重定向