1. 思考题

  1. 首先,MIPS中的虚拟内存结构如下:

    因此,base_pgdir中建立了pages和envs的物理地址与虚存中pages和envs的虚拟地址之间的关系,这也同样解释了在map_segment中传入的UPAGES和UENVS的含义,就是pages和envs的虚存首地址。

    之后,由于MOS的内核数据共享机制,需要把UTOP以上UVPT以下,即pages和envs的数据暴露给用户空间,因为base_pgdir中已经有分配好的映射关系,因此需要把UTOP到UVPT所对应的页目录项赋值给每个进程的页目录。又由于用户自身的4MB页表放置在UVPT,因此页目录自映射项相对于页目录的偏移即为PDX(UVPT),因此需要把e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V;

  2. 在load_icode中,遍历了每一个程序头表,然后调用了elf_load_seg函数来加载段内容到内存中,并在进程的页目录中建立映射关系。其传参如下图:

    从图中可以看到,最后一个参数是e,也就是进程控制块的指针。在elf_load_seg函数中,直接将第四个参数,也就是data,传递给了load_icode_mapper函数,因此data就是e,是进程控制块的指针。

    它的作用是要在页目录中建立映射关系,因此需要e->env_pgdir和e->env_asid。因此没有这个参数不可以,否则CPU无法通过tlb找到物理内存中的程序或数据。

  3. 需要处理三种页面的加载情况:1. 从va开始,未页对齐的部分。2. 开头页对齐的数据页面。3. 超出bin_size部分的.bss内容。
    第一种情况下,需要在分配的物理页框的offset位置开始写入数据。
    第二种情况下,在分配的物理页框中写入len字节的数据。
    第三种情况下,只分配页框,不写入数据。

  4. 虚拟地址。CPU访问的都是虚拟地址。

  5. 0号异常handle_int定义在kern/genex.S中,代码如下:

    2号异常用grep没有找到,仅在exception_handlers中有。
    3、4号异常是tlb_miss,异常处理函数是do_tlb_refill

  6. 首先,在触发时钟中断后,CPU会跳转至异常处理入口,之后运行异常处理指令。异常处理指令首先会根据异常类型跳转到不同的异常处理函数中,针对时钟中断,会跳转到时钟中断函数。在内部,会判断是否是时钟中断,如果是的话会跳转到time_irq函数中,在进行一些操作后跳转到schedule函数。schedule函数会判断当前进程进程是否需要切换,如果需要切换的话,会将当前进程移至sched队列末尾,并选取sched队列头的进程去运行。从而实现进程的调度。

2. 难点分析

  1. 进程的创建过程需要好好理解。进程的创建大致可以分为两部分:env_alloc 和 load_icode。首先需要申请一个进程控制块,并配置好信息;之后需要将可执行文件中的段数据加载到内存中,并在页目录中建立映射关系。最后再将该进程控制块从空间队列移至调度队列中。

  2. 进程的调度。进程的自动调度主要依靠时间片轮转来实现。每个进程拥有一个优先级,这个优先级实质上就是可运行时间片的个数。优先级越高,可运行时间片数目越多,进程运行的时间就越长。每次时间片截至,就会触发时钟中断,之后CPU进入异常处理函数进行处理。如果是时钟中断异常,最后会调用schedule函数。schedule函数首先判断当前进程是否需要切换,有很多原因可以使得当前进程需要切换,比如yield为1,当前进程是NULL,当前进程时间片结束了,当前进程不可运行等等。如果满足以上条件,schedule函数会选择下一个可运行进程并接着运行。如果不满足,说明当前进程仍然可以继续运行,因此时间片计数减一,然后接着运行。

  3. 共享页目录。MOS中特有的功能就是将内核的一些数据暴露在用户空间,从而让他们能够访问到内核的数据,具体来说就是 pages 和 envs 。这两个控制块的映射关系被复制到了每一个进程的页目录中,因此所有的用户进程访问这两个的地址,都可以通过二级页表来访问到。

3. 实验体会

  1. 本次实验总体难度适中,容易理解,但是细节很多,因此课后需要认真复习和研究,明白每一处操作都在干什么。例如共享页目录的时候,要理解MOS是如何给每一个用户进程共享的,实际上是通过复制页目录项,也就是共享二级页表,来实现共享特定的空间内容。同时例如elf_load_seg 函数是如何将段头表内的数据加载到物理内存中并进行映射的,其通过了load_icode_mapper这个回调函数来实现这一操作。回调函数负责将一页的内容加载到内存中并建立映射关系,具体如何加载,加载多少,这些细节都是要研究的。

4. 原创声明

本片报告所有内容均为个人原创。