Part A: 用户环境和异常处理
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
环境
struct Env {
struct Trapframe env_tf; // Saved registers 环境停止时寄存器的值
struct Env *env_link; // Next free Env
envid_t env_id; // Unique environment identifier
envid_t env_parent_id; // env_id of this env's parent
enum EnvType env_type; // Indicates special system environments
unsigned env_status; // Status of the environment
uint32_t env_runs; // Number of times environment has run
// Address space 地址空间
pde_t *env_pgdir; // Kernel virtual address of page dir
};
与Unix的进程类似,JOS环境将"thread"和"address space"的概念结合。我们这里称JOS的环境为进程,环境描述符为进程描述符。
JOS要运行一个进程的话,必须将"env_tf"和"addresss space"设置好。
JOS不支持多进程,所以只有一个kernel stack。
进程描述符在系统启动时生成,我们维持以下数据结构以管理进程描述符:
struct Env *envs = NULL; // All environments
struct Env *curenv = NULL; // The current env
static struct Env *env_free_list; // Free environment list
分配环境数组
我们曾用mem_init()分配内存给pages[]数组,envs[]数组同样适用。
创建并运行环境
由于JOS还没有文件系统,所以我们要将ELF文件嵌入kernel中。
load_icode(struct Env *e, uint8_t *binary)
将ELF文件取出来执行。lcr3
函数用于切换地址空间。
用户进程被激活的过程如下:
start (kern/entry.S)
i386_init (kern/init.c)
cons_init
mem_init
env_init
trap_init (still incomplete at this point)
env_create
env_run
env_pop_tf
此时编译运行系统,系统可以执行hello
直到触发system call
,然后triple fault
。因为我们没有实现从user space
到kernel
的切换。
处理中断和异常
我们实现异常处理和系统调用处理,去解决以上问题。
被保护的控制转移
中断和异常都是被保护的控制转移,实现从user
模式到kernel
模式的安全转换。x86
使用两种机制提供这种保护:The Interrupt Descriptor Table
和 The Task State Segment
却记录引发中断或异常的进程的状态。
异常和中断的种类
处理器异常的interrupt vectors
是0到31,对应IDT的第0到31记录。
software interrupts
或hardware interrupts
的interrupt vectors
是大于31的。
内嵌的异常和中断
设置IDT
异常处理的控制流程
IDT trapentry.S trap.c
+----------------+
| &handler1 |---------> handler1: trap (struct Trapframe *tf)
| | // do stuff {
| | call trap // handle the exception/interrupt
| | // ... }
+----------------+
| &handler2 |--------> handler2:
| | // do stuff
| | call trap
| | // ...
+----------------+
.
.
.
+----------------+
| &handlerX |--------> handlerX:
| | // do stuff
| | call trap
| | // ...
+----------------+