111qqz的小窝

老年咸鱼冲锋!

【施工中】MIT 6.828 lab 3: User Environments

JOS的environments基本可以理解成”process”进程的同义词,但是由于”process”是一个unix术语,因此使用environment这个词.

Part A: User Environments and Exception Handling

查看 kern/env.c文件,看到三个全局变量:

envs会在JOS启动后会指向一个Env structures的数组,表示JOS中的全部environments. 理论上,JOS kernel最多能支持NENV个同时运行的environments. 但是实际上不会远不会达到这个数量.

env_free_list是一个链表结构,用来存放当前没有在运行的Env structure.. 和page_free_list 类似.

curenv表示的是当前正在运行的environment,当JOS刚刚启动,第一个environment运行之前,curenv的值为NULL.

接下来我们来阅读一下inc/env.h文件

 

  • env_tf: 用来在切换环境时保存各种register的值,以便之后恢复现场.
  • env_link: 用于构成一个链表结构,指向喜爱一个空闲的 environment.
  • env_id: 用于唯一标识使用当前这个Env structure(也就是envs数组中的某个位置)的environment的ID.当这个environment终止时,envs数组中的用一个位置可能会被re-allocate一个新的environment,但是env_id是不同的.虽然env_id不同,但是env_id的最后10bit是用来标识在envs的下标的,如果使用的是envs数组中的同一个位置,这部分是相同的.具体可以参考inc/env.h.
  • env_parent_id: 创建这个environment的environment 的env_id. 就是父进程id…
  • env_type:  用于区分不同种类的环境.对于大部分环境,类型都是ENV_TYPE_USER.
  • env_status: 用来标识当前这个environment的状态.
    • ENV_FREE: 标识一个environment是inactive的,因此在env_free_list上.
    • ENV_RUNNABLE: 标识一个environment等待运行在处理器上.
    • ENV_RUNNING:标识正在运行
    • ENV_NOT_RUNNABLE: 标识一个目前active的环境,但是没有准备好运行,原因可能是正在等待一个其他environment的交互.
    • ENV_DYING: 可以类比”僵尸进程”
  • env_pgdir: 当前这个environment的page directory.

 

Allocating the Environments Array

Modify  mem_init() in kern/pmap.c to allocate and map the  envs array. This array consists of exactly  NENV instances of the  Env structure allocated much like how you allocated the  pages array. Also like the  pages array, the memory backing  envsshould also be mapped user read-only at  UENVS (defined in inc/memlayout.h) so user processes can read from this array.

You should run your code and make sure  check_kern_pgdir() succeeds.

和mem_init中申请pages的空间是一样的.

 

后面有空再写

 

 

 

 

 

说点什么

您将是第一位评论人!

提醒
wpDiscuz