6.868 Lab 3 用户环境

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 spacekernel的切换。

处理中断和异常

我们实现异常处理和系统调用处理,去解决以上问题。

被保护的控制转移

中断和异常都是被保护的控制转移,实现从user模式到kernel模式的安全转换。x86使用两种机制提供这种保护:The Interrupt Descriptor TableThe Task State Segment却记录引发中断或异常的进程的状态。

异常和中断的种类

处理器异常的interrupt vectors是0到31,对应IDT的第0到31记录。
software interruptshardware interruptsinterrupt 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
|                |             // ...
+----------------+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值