关于[特权级],[一致/非一致] 代码段 [内核栈] 的思考

来源:互联网 发布:通风管道设计绘制软件 编辑:程序博客网 时间:2024/06/06 00:40

逻辑上应该是这样:

- 为什么要有特权级概念?
“现实”的需要,导致了硬件设计中包括了所谓特权级的概念,我们对现实问题的分析和认识,发现了特权级的思想应该存在于OS设计中,这种思想的物理表现
形式就是硬件寄存器中的CPL,DPL,RPL位以及一整套实现特权级审查逻辑的电路;

- 为什么要有所谓一致和非一致代码段的概念呢?
还是因为“现实”的需要,由于OS设计时的需要,OS无疑应该是整个计算机系统环境中最高级的部分,但是也不能一概而论,OS中有些高权级代码(比如提
供服务的代码)是允许低权级程序访问的,而有些又不允许,为了区分这些代码,就引入了所谓一致和非一致的概念,允许低权级访问的高权代码,我们把它放在
一致码段里,不允许低权级访问的高权代码,我们把他们放在非一致码段里,这里,我们可以把OS看成一个提供服务的公仆。

而对于数据段,高权对于低权的访问总是允许的,关于这么设计的原因,不妨这么想,显然不能允许低权者访问高权者的数据,而高级者为了监视低级者的运行,
应该可以访问低级者的数据。(注意,高级者仅仅是“监督”已经运行的低级者,而不是“导致或发起”低级者的运行,高级者不能导致低级者的运行就是说,高级者
不能“访问或调用”低级者代码。)

代码:
高 -〉低 X   (高级者不应“发起”低级者的运行)
低 -〉高 O  (低级者可以使用高级者提供的服务,但能够提供服务的高级者必须位于一致码段)

数据:
高 -〉低 O  (高级者必须能够监视低级者的运行)
低 -〉高 X   (低级者绝不允许窥探高级者的秘密)

这是我的理解,我感觉OS以及硬件的设计体现了很多我们现实生活中分析问题,解决问题的哲学思想,甚至是世界观。

代码:
高 -〉低 X   (高级者不应“发起”低级者的运行)
低 -〉高 O  (低级者可以使用高级者提供的服务,但能够提供服务的高级者必须位于一致码段)

但是,内核都是非一致代码,那么低如何访问高呢?
就是中断机制。

低 -〉高 O  (低级者可以使用高级者提供的服务,但能够提供服务的高级者必须位于一致码段或者通过Call Gate
中断机制通过Interrupt Gate,或者 Trap Gate,这都是特殊的Call Gate。

BUT!
我感觉Call Gate起到了一个降低门槛的作用,而非一致码段的本意就是限制低权到高权的访问,现在又用Call Gate打破了这个限制,这是不是有些抵触呢?对于只有通过Call Gate才能访问的非一致码段中的代码,为什么不干脆就放到一致码段去呢?

来自正在运行的低权task之外的中断需要得到服务,但这种服务的请求其实并不是该被中断的task本身对高权OS服务的请求,但是为了服务这种中断,每个低权task都不得不准备一个所谓的内核栈,这样是不是很浪费呢?为什么不集中在OS内核中搞一个栈专门服务于中断呢?这样每个task的TSS中所需要保存的信息也少了一些。

Call gates allow a single code segment to have procedures that can be accessed at 
different privilege levels.
 For example, an operating system located in a code 
segment may have some services which are intended to be used by both the oper-
ating system and application software (such as procedures for handling character 
I/O). Call gates for these procedures can be set up that allow access at all privilege 
levels (0 through 3). More privileged call gates (with DPLs of 0 or 1) can then be set 
up for other operating system services that are intended to be used only by the oper-
ating system (such as procedures that initialize device drivers).

<Intel Manual 3A> 4.8.4 最后一段,解释了Call Gate存在的原因。

简单的说,Call Gate好像一个可定义的门槛, 实现了灵活的访问权限控制。


对于不需要施加太多使用限制代码入口点,可以为之设置一个不太高的门槛;
而对于需要严格限制其使用的代码入口点,就为之设置一个比较高的门槛;

反过来想,假如没有 Call Gate,那么权限控制的粒度就只能是整个段,而没办法再细化到段内的一片代码。
也就是说,我们在设计权限控制机制的时候,不仅要注意控制的对象,还要注意控制的粒度。

转载自:http://www.oldlinux.org/oldlinux/viewthread.php?tid=12245

0 0