操作系统身居内核态(kernel mode)综合管理软硬件资源,但是一般而言,用户所编写的程序也会使用到操作系统资源。
一个简单的想法是,不加任何限制的允许用户态的程序调用资源
上面的好处显而易见,那就是fast(快),该程序可以自由的访问软硬件资源,达到程序所预期的速度。
这种简单的管理方式带来了两个问题
第一个问题,OS无法确定程序不会去访问OS不想让他访问的资源
第二个问题,OS无法实现中断/杀死一个进程,并且让另一个进程访问资源(实现共享性)
当程序发出一些“敏感指令”时,例如:发出I/O请求,申请更多的内存资源orCPU资源,如果不加以限制,哪么一个简单的程序就有可能“吃掉”所有的计算机资源来使得其崩溃。
此外,如果不对程序访问权限加以限制,哪么一个程序就可以自由地从磁盘读写数据,这就会导致我们对磁盘的所有保护措施都会失效,因为操作系统这个大门已经“失守”。
自然而然的想法就是,OS必须拥有对其资源的管理权,即必须把程序的执行加以限制,我们来看intel是如何实现的。
第一个过程,初始化trap table(trap指令表),保存syscal handler的地址
第一个我们要接触的概念是trap,trap可以翻译为“陷阱”,它所代表的含义是:用户态触发“陷阱”进入到内核态(这里“陷阱”倒是一个好词,特权升级了)
如何程序在此刻触发trap
哪么接下来OS就会
首先是创建进程列表(按照各种管理策略,例如先来先服务、短进程优先等等),然后是开辟一块内存来装载程序。启动为argv准备的用户栈,使用kernel stack来装填reg/pc寄存器的内容
这里出现了一个新的kernel stack
在使用trap指令从user mode进入kernel mode以后,在OS完成一系列操作的时候,同时也会生成对应的数据(PC寄存器,reg寄存器),将会以 return-from-trap 的形式返回数据,为了正确的返回这些数据,OS在内核开辟了一个新的stack来保存这些数据。
如下图所示