「BUAA OS Lab4」名词解释
变量和类型
__SYSCALL_BASE
位置:include/unisted.h
系统调用号基址。内核确定是哪类系统调用的唯一依据。
1 |
SYS_putchar
位置:include/unisted.h
1 |
TF_*
TrapFrame相关宏定义
1 |
|
COW
Copy On Write,写时复制。
当fork后的父子进程中有修改内存(一般是数据段或栈)的行为发生时,内核会捕获页写入异常,并哎异常处理时为修改内存的进程的地址空间中相应地址分配新的物理页面。
env
用户进程用以访问自身进程块的指针。其值在fork
时会被更新。
位置:user/libos.c
函数和宏函数
handle_sys
位置:lib/syscall.S
1 | NESTED(handle_sys,TF_SIZE, sp) |
msyscall
位置:user/syscall_wrap.S
1 | LEAF(msyscall) |
sys_env_alloc
位置:lib/syscall_all.c
1 | ``` |
sys_set_pgfault_handler
位置:lib/syscall_all.c
设置pgfault handler(异常处理函数)的函数入口和xstacktop(异常处理栈)
1 | int sys_set_pgfault_handler(int sysno, u_int envid, u_int func, u_int xstacktop) |
page_fault_handler
位置:lib/traps.c
负责完成写时复制处理前的相关设置,返回前将cp0_epc
指向env_pgfault_handler
函数入口。env_pgfault_handler
指向的函数就是pgfault
,这是真正处理缺页异常的函数。这里我们也可以看到,写时复制的实现依赖于缺页异常实现。
1 | void |
fork
位置:user/fork.c
创建一个子进程。
1 | int |
pgfault
位置:user/fork.c
page fault
写时复制函数处理函数,是page_fault_handler
后续会调用的函数,负责对PTE_COW
标志的页面进行处理。
1 | static void |
duppage
位置:user/fork.c
父进程对子进程页面空间进行映射以及相关标志设置的函数。
1 | duppage(u_int envid, u_int pn) |
set_pgfault_handler
位置:user/pgfault.c
父进程为子进程设置页错误处理函数的函数
1 | void |
文件
entry.S
用户进程的入口
libos.c
用户进程入口的C语言部分,负责完成执行用户程序 umain
前后的准备和清理工作
genex.S
实现了 MOS 的中断处理流程
This is copyright.