这是我做过耗时最长的一个实验,写代码花了半天,debug花了两天半。
系统调用后头一定要跟检查。。。
必须在特定的时刻杀死进程,并释放资源,比如:
虽说 makefile 会根据修改重新部分编译,但似乎有的部分没有照顾到?有个地方我修改对了,但由于没有make clean 然后重新编译花了巨久,最后通过的代码跟之前没什么差别,莫名其妙clean一下然后就过了
由于这里的错跟页表关系很大,错误及其难以定位
:需要查阅文档、看汇编、手动计算 pte、各种地方加 printf,最后才可能在某个狭小的地方找到错误
而且很多错误你完全没有头绪
原内核代码也有些异样,一种情况下内核直接 panic 终止运行了,但是在另一种相近的情形下处理方式居然不同?我都不知道该不该把这个panic改成return 0了
很多时候只需要修改底层实现即可,上层接口完全可以保持不变。但这样需要设计良好的抽象,不能打破抽象间隔,不然会很混乱
新进程内存的复制全部都会通过 uvmcopy
,只需要将父进程的映射同步到子进程即可,同时把可写页设为只读&COW
,在写时会遇到write page fault,然后检查是否是COW,是则分配一个物理页,复制原来的内容过去,unmap原来的,map新的可写且非COW的PTE
需要对 copyout做类似的处理
需要增添计数机制,在引用为0时释放物理页,主要修改 kalloc 和 kfree