创建并执行用户进程

    proj10.1概述

    proj10.1是lab3的第二个project。它在proj10的基础上实现了对用户态进程的支持,主要扩展设计了用户进程执行的用户地址空间、对用户进程访存错误的异常处理、提供用户进程执行效率的按需分页和写时复制的支持、加载并执行依附在ucore内核文件的用户执行程序、实现系统调用机制等。

    • mm/memlayout.h:定义了用户态空间的范围,具体可看“Virtual memory map”的ASCII图注释。
    • mm/vmm.[ch]:在vmm.h文件中,扩展了mm_struct数据结构,支持多进程对mm_struct的引用计数和互斥访问,和针对mm_struct结构的引用计数操作和互斥操作;在vmm.c中,主要增加了部分函数防止多进程(比如父子进程、多线程等)同时访问进程的mm进程内存管理数据结构。
    • syscall/syscall.[ch]:新增加的部分,提供用户态进程所需的系统服务的操作系统层接口,根据系统调用号,在转到具体的服务功能函数中完成用户态进程的服务请求。
    • trap/trap.c:增加对系统调用的初始化和处理,扩展对访存错误异常的处理。
    • user/*:实现应用程序所需的基本库函数支持,提供实现系统调用的用户层接口。

    编译并运行proj10.1的命令如下:

    上述执行输出相对于proj10没有太多变化,只是出现了“kernel_execve: … hello pass”等字符串。但其实在其背后,涉及创建用户态进程,把执行代码加载到用户态线程地址空间,执行系统调用等一系列操作。为了更好地理解proj10.1的设计和实现方案,我们先需要在了解一下用户态进程的特征。下面我们将从原理和实现两个方面对此进行进一步阐述。