xv6内核页表何时添加进程trapframe映射?
xv6进程trapframe的内核页表映射机制
映射时机:进程切换阶段(而非陷入内核时)
xv6并没有在进程陷入内核时才添加trapframe的映射,而是采用了固定虚拟地址+动态更新映射的设计:- 内核页表中预留了一个固定的虚拟地址(定义为
TRAPFRAME,比如RISC-V版本中是0x3ffffff000),专门用于访问当前运行进程的trapframe。 - 进程创建时(
allocproc函数流程),内核会为新进程分配一块物理内存作为trapframe,但此时不会立刻加入内核页表映射。 - 每次进程切换(比如调度器
scheduler切换进程、fork/exec后的进程切换)时,内核会修改内核页表,将TRAPFRAME这个固定虚拟地址映射到当前要运行进程的trapframe物理地址,随后刷新TLB让映射生效。
- 内核页表中预留了一个固定的虚拟地址(定义为
为什么能直接访问
p->trapframe?
代码中的p->trapframe本质是指向TRAPFRAME这个固定虚拟地址的指针。进程切换完成后,该虚拟地址已经正确映射到当前进程的trapframe物理页,因此内核可以直接通过这个指针读写trapframe中的字段(比如epc)。为什么复用固定虚拟地址?
由于同一时间只有一个进程在运行,复用固定虚拟地址可以避免在内核页表中为每个进程添加独立的trapframe映射项,既节省页表空间,也简化了内核对trapframe的访问逻辑。
内容的提问来源于stack exchange,提问作者Wang
相关产品推荐
相关产品推荐

