Mechanism:Limited Direct Execution

虚拟化机制的几大挑战:1.性能。在实现虚拟化的同时不增加系统过多开销。2.控制。高效运行程序的同时对CPU保持控制(对资源的管理)。

Limited direct execution:直接在CPU中运行程序。因此,OS启动程序是首先在进程列表中创建一个process entry,为其分配内存,从磁盘中将代码加载到内存,找到main()入口开始执行,完毕后执行return,OS释放内存,将进程从列表中删除。

这个方法会带来两个问题:1.OS如何保证一个程序在它有效运行时不做我们不允许它做的事情?2.OS如何将它停止,并切换到其他进程。

Peoblem #1限制操作

OS如何辨别类似open()或read()的系统调用?当你调用open()时,你是在执行C库中的一个procedure call。其中,无论是open()还是其他系统调用,库都会使用与内核达成一致的调用来将参数放入彼此都了解的位置(堆栈,特定寄存器),将系统调用号也放入公共位置,然后执行上述trap instruction。trap unpacks并返回值后,库中代码返回control给发出系统调用的程序。因此,进行系统调用的C库部分是在汇编中hand-coded,它们必须遵循约定处理参数并返回正确值,以及执行hardware-specific trap instruction。

当运行在CPU上的程序想执行一些限制操作(向磁盘发I/O,获取更多类似CPU或内存的系统资源)时?

有一种方式是对程序访问不加限制。这样影响构建不同的操作系统,如果构建一个检查访问文件权限的文件系统时,不能简单地让任何程序都向磁盘发出I/O。这里引入新的Processor mode——user mode,如果运行在user mode中,一进程无法发出I/O,如果坚持发出请求则导致处理器引发异常,OS可能杀死进程。另一个是kernel mode,OS运行的模式能使用特权指令。

如果user 进程想执行特权操作怎么办?线代硬件为用户程序提供执行系统调用(允许内核向user  process开放功能:访问文件系统,创建销毁进程,进程间通信,分配内存)的能力。

要执行系统调用,程序必须执行特殊的陷阱指令。该指令同时跳转到内核并将权限级别提升到内核模式;一旦进入内核,系统现在可以执行所需的任何特权操作(如果允许),从而为调用进程执行所需的工作(处理器将程序计数器,flags,registers放入每个程序内核栈)。完成后,操作系统会调用一个特殊的从陷阱返回指令(return-from-trap将值从堆栈中pop出并继续执行程序),正如您所料,该指令将返回到调用用户程序,同时将权限级别降低回用户模式。

猜你喜欢

转载自www.cnblogs.com/blackprience/p/10773392.html
今日推荐