Exercise 1

i385_init 通过给 env_create 传递 ENV_TYPE_FS 类型参数来标识文件系统环境,修改 env_create 使得文件系统环境拥有 I/O 权限,IO 权限由 EFLAGS 寄存器的 IOPL 位设定 image

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. image flush_block 将从某个虚地址开始的一个 block 写进磁盘,如果这个 block 没有被映射到磁盘或者这个 block 不是 dirty 的话就什么都不做。我们可以通过 uvpt 的 PTE_D 这个位来判断是否需要将这个 block 写进磁盘,一旦写入磁盘我们需要重置 PTE_D

image

Exercise 3

用 free_block 作为参考来实现 alloc_block, 功能是从 bitmap 中找到一个 free 的 disk block, 然后将它标记为已使用,返回这个 block 的编号,一旦分配了 block,就需要立即将 bitmap 所在的 block 刷进磁盘来保证文件系统的一致性。 image

Exercise 4

实现 file_block_walk() 和 file_get_block,file_block_walk() 用来将 block 的偏移映射到 struct File 中的指针或者是 inderect block(二级映射), file_get_block 将其映射到磁盘。 image

image

Exercise 5

实现 serve_read(), 可以用已经实现了的 file_read() 来完成 image

Exercise 6

实现 serve_write 和 devfile_write image

image

Exercise 7

spawn 依赖于 sys_env_set_trapframe 系统调用,实现 sys_env_set_trapframe image

image

Exercise 8

修改 lib/fork.c 中的 duppage,如果是 PTE_SHATE 时,直接拷贝映射,并使用 PTE_SYSCALL 来设置相关位 image

实现 copy_shared_pages, 遍历所有的页表项,将是 PTE_SHARE 的项拷贝到子环境

image

Exercise 9

实现键盘中断

image

Exercise 10

实现 shell 的 io 重定向

image

image