ucore操作系统学习(五) ucore lab5用户进程管理

Java58

ucore在lab4中实现了进程/线程机制,能够创建并进行内核线程的调度。通过上下文的切换令线程分时的获得CPU,使得不同线程能够并发的运行。

在lab5中需要更进一步,实现我们平常开发接触到的、运行在用户态的进程/线程机制。用户线程通常用于承载和运行应用程序,为了保护操作系统内核,避免其被不够鲁棒的应用程序破坏。应用程序都运行在低特权级中,无法直接访问高特权级的内核数据结构,也无法通过程序指令直接的访问各种外设。

但应用程序访问高特权级数据、外设的需求是不可避免的(即使简单的打印数据到控制台中也是在对显卡这一外设进行控制),因此 ucore在lab5中也实现了系统调用机制。应用程序平常运行在用户态,在有需要时可以通过系统调用的方式间接的访问外设等受到保护的资源。

系统调用介绍

系统调用是操作系统提供的一种特殊api接口,底层是通过中断实现的。应用程序调用系统中断时,其CPL特权级会被暂时的提升到ring0,因此便获得了访问外设、内核数据的能力。这一提升CPL特权级从外层用户态到里层内核态的过程,也被称为陷入内核(系统调用会陷入内核,但是陷入内核的方式除了系统调用外,还包括触发保护异常等)。

由于系统调用是操作系统的开发人员精心设计的,且对传入的参数等等有着很严格的控制,确保了系统调用不会对内核造成破坏。同时,在系统调用中断返回时,也会将其CPL特权级对应用程序透明的还原到用户态。在ucore的lab5中,提供了一些用户态的demo应用程序,并在内核实现了诸如fork、exit、kill、yield、wait等等系统调用功能以及C实现的应用程序系统调用库。

通过lab5的学习,可以更深入的了解操作系统中用户态应用程序的加载、运行和退出机制,以及系统调用的工作原理。

lab5是建立在之前实验的基础之上的,需要先理解之前的实验内容才能顺利理解lab5的内容。

可以参考一下我关于前面实验的博客:

下面通过解析lab5实验的源码,进一步分析在ucore中加载、并运行一个用户态应用程序的机制,以及系统调用是如何实现的。

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长