免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 875 | 回复: 0
打印 上一主题 下一主题

深入介绍Linux内核(六) [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之北控
日期:2022-03-04 22:35:50
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-08 10:38 |只看该作者 |倒序浏览

.......(续第四章)
4.5 保护
保护机制是可靠的多工执行环境所必须的。它可用於保护各个任务免受相互之间的干扰。在软体发展的任何阶段都可以使用段级和页级保护来协助寻找和检测设计问题和错误。当程式对错误记忆体空间执行了一次非期望的引用,保护机制可以阻止这种操作並且报告此类事件。
保护机制可以被用於分段和分页机制。处理器寄存器的2个Bit位元定义了当前执行程式的特权级,称为当前特权级CPL(Current Privilege Level)。在分段和分页位址转換行程中,处理器将对CPL进行验证。
透过设置控制寄存器CR0的PE标志(位元0)可以让处理器工作在保护模式下,从而也就开啟了分段保护机制。一旦进入保护模式,处理器中並不存在明确的控制标志来停止或啟用保护机制。不过基於特权级的保护机制部分可以透过把所有段选择符号和段描述符号的特权级都设置为0级来隐含地关闭。这种处理方式可以在段之间禁止特权级保护壁垒,但是其他段长度和段类型检查等保护机制仍然起作用。
设置控制寄存器CR0的PG标志(位元31)可以开啟分页机制,同时也开啟了分页保护机制。同樣,处理器中也沒有相关的标志用来在分页开啟条件下禁止或开啟页级保护机制。但是透过设置每个页目錄项和页表项的读/写(R/W)标志和用戶/超级用戶(U/S)标志,我们可以禁止页级保护机制。设置这两个标志可以使得每个页面都可以被任意读/写,因此实际上也就禁止了页级保护。
对於分段级保护机制,处理器使用段寄存器中选择符号(RPL和CPL)和段描述符号中各个栏位执行保护验证。对於分页机制,则主要利用页目錄和页表项中的R/W和U/S标志来实现保护操作。
4.5.1 段级保护
在保护模式下,80X86提供了段级和页级保护机制。这种保护机制根据特权级(4级段保护和2级页保护)提供了对某些段和页面的存取限制能力。例如,作业系统代码和资料存放在要比普通应用程式具有高特权级的段中。此后处理器的保护机制将会限制应用程式只能按照受控制的和规定的方式存取作业系统的代码和资料。
当使用保护机制时,每个记忆体引用都将受到检察以验证记忆体引用符合各种保护要求。因为检查操作是与位址变換同时平行作业,所以处理器效能並沒有受到影响。所进行的保护检查可分为以下几类:
▓ 段界限检查;
▓ 段类型检查;
▓ 特权级检查;
▓ 可定址范围限制;
▓ 行程入口鲇限制;
▓ 指令集限制。
所有违反保护的操作都将导致產生一个异常。下面各节描述保护模式下的保护机制。
段限长Limit检查
段描述符号的段限长(或称段界限)栏位用於防止程式或行程定址到段外记忆体位置。段限长的有效值依赖於颗粒度G标志的设置状态。对於资料段,段限长还与标志 E (扩展方向)和标志 B (预设堆疊指标大小和/或上界限)有关。E标志是资料段类型的段描述符号中类型栏位的一个Bit。
当G标志清除零时(位元组颗粒度) ,有效的段长度是20位的段描述符号中段限长栏位Limit的值。在这种情況下,Limit的范围从0到0xFFFFF(1MB)。当G标志置位元时(4KB页颗粒度) ,处理器把Limit栏位的值乘上一个因数4 K。 在这种情况下,有效的Limit范围是从0xFFFFFFFF(4GB)。请注意,当设置了G标志时,段偏栘(位址)的低 12 位不会与Limit进行对照检查。例如,当段限长Limit等於0时,偏移值0到0xFFF仍然是有效的。
除了下扩段以外的所有段类型,有效Limit的值是段中允许被存取的最后一个位址,它要比段长度小l个位元组。任何超出段限长栏位指定的有效位址范围都将导致產生一个一般保护異常。
对於下扩资料段,段限长具有同樣的功能,但其含义不同。这裡,段限长指定了段中最后一个不允许存取的位址,因此在设置了B标志的情況下,有效偏移范围是从(有效段偏移+1)到0xFFFF FFFF;当B清除零时,有效偏移范围是从(有效段偏移+1)到0xFFFF。当下扩段的段限长为0时,段会有最大长度。
除了对段限长进行检查,处理器也会检查描述符号表的长度。GDTR、IDTR和LDTR寄存器中包含有16位的限长值,处理器用它来防止程式在描述符号表的外面选择描述符号。描述符号表的限长值指明了表中最后一个有效位元组。因为每个描述符号是8位元组长,因此含有N个描述符号项的表应该具有限值8N-l。
选择符号可以具有0值。这樣的选择符号指向GDT表中的第一个不用的描述符号项。尽管这个空选择符号可以被载入进一个段寄存器中,但是任何使用这种描述符号引用记忆体的企图都将產生一个一般保护性異常。
段类型TYPE检查
除了应用程式码和资料段有描述符号以外,处理器还有系统段和门两种描述符号类型。这些资料结构用於管理任务以及異常和中断。请注意,並非所有描述符号都定义一个段,门描述符号中存放有指向一个行程入口点的指标。段描述符号在两个地方含有类型资讯,即描述符号中的 S 标志和类型栏位TYPE。处理器利用这些资讯对于非法使用段或闸导致的程式设计错误进行检测。
当操作段选择符号和段描述符号时,处理器会随时检查类型资讯。主要在以下两种情况下检查类型资讯:
⑴ 当一个描述符号的选择符号载入进一个段寄存器中。此时某些段寄存器只能存放特定类型的描述符号,例如:
● CS暂存器中只能被载入进一个可执行段的选择符号;
● 不可读可执行段的选择符号不能被载入进资料段寄存器中;
● 只有可写资料段的选择符号才能被载入进SS寄存器中。
⑵ 当指令存取一个段,而该段的描述符号已经载入进段寄存器中。指令只能使用某些预定义的方法来存取某些段。
● 任何指令不能写一个可执行段;
● 任何指令不能写一个可写位沒有置位的资料段;
● 任何指令不能读一个可执行段,除非可执行段设置了可读标志。
特权级
处理器的段保护机制可以识別4个特权级(或特权层) ,0级到3级。数值越大,特权越小。图4-19示出了这些特权级如何能被解释成保护环形式。环中心(保留给最高级的代码、资料和堆栈)用於含有最重要软体的段,通常用於作业系统核心部分。中间两个环用於较为重要的软体。只使用2各特权级的系统应该使用特权级0和3。

处理器利用特权等级来防止执行较低特权级的程式或任务存取具有较高特权级的那一个段,
除非是在受控的条件下。当处理器检测到一个违反特权级的操作时,它就会產生一个一般保护性異常。
为了在各个代码段和资料段之间进行特权级检测处理,处理器可以识別以下三种类型的特权等级:
▓ 当前特权等级CPL(Current Privilege Level)。CPL是当前正在执行程式或任务的特权级。它存放存CS 和SS段寄存器的位元0和位元1 中。通常,CPL等於当前代码段的特权级。当程式把控制转移到另一个具有不同特权级的代码段中时,则处理器就对处理器就会改变CPL。当存取一个一致性(conforming)代码段时,则处理器对CPL的设置有些不同。特权级值高於(即低特权级)或等於一致代码段DPL的任何段都可以存取一致代码段。並且当处理器存取一个特权级不同於CPL的一致代码段时,CPL並不会被修改成一致代码段的DPL。
▓ 描述符号特权级DPL(Descriptor Privilege Level)。 DPL是一个段或闸的特权级。它存放在段或闸描述符号的DPL栏位中。正当前执行代码段试图存取一个段或闸时,段或闸的DPL会用来与CPL以及段或闸选择符号中的RPL(见下面说明)作比较。根据被存取的段或闸的类型不同,DPL也有不同的含义:
● 资料段(Data Segment)。其DPL指出允许存取本资料段的程式或任务应具有的最大特权级数值。例如,如果资料段的特权级DPL是l,那麼只有执行CPL为0或l的程式可以存取这个段。
● 非一致代码段(Nonconforming code segment) (不使用呼叫门)。其DPL指出程式或任务存取该段必须具有的特权级。例如,如果某个非一致代码段的DPL是0,那麼只有执行在CPL为0的程式能夠存取这个段。
● 呼叫门(Call Gate)。其DPL指出存取呼叫门的当前执行程式或任务可处于的最大特权级数值。(这与资料段的存取规则相同。)
● 一致和非一致代码段(透过呼叫门存取)。其DPL指出允许存取本代码段的程式或任务应具有的最小特权级数值。例如,如果一致代码段的DPL是2,那么执行在CPL为0的程式就不能存取这个代码段。
● 任务状态段TSS。其DPL指出存取TSS的当前执行程式或任务可处於的最大特权级数值。(这与资料段的存取规则相同。)
▓ 请求特权级RPL(Request Privilege Level)。RPL是一种赋予段选择符号的越特权级,它存放在选择符号的位元0和位元l中。处理器会把RPL与CPL比较,以确定是否允许存取一个段。即使程式或任务具有足夠的特权级(CPL)来存取一个段,但是如果提供的RPL特权级不足的话存取也将被拒絕。也即如果段选择符号的RPL其数值大於CPL,那麼RPL将覆盖CPL(而使用RPL作为检查比较的特权级),反之也然。即始终取RPL和CPL中数值最大的特权级作为存取段时的比较对象。因此,RPL可用来确保高特权级的代码不会代表应用程式去存取一个段,除非应用程式自己具有存取这个段的许可权。
当段描述符号的段选择符号被载入进一个段寄存器时就会进行特权级检查操作,但用於资料存取的检查方式和那些用於在代码段之间进行程式控制转移的检查方式不一樣。因此下面分两种存取情況来考虑。
4.5.2存取资料段时的特权级检查
为了存取资料段中的运算元,资料段的段选择符号必须被载入进资料段寄存器(DS、ES、FS或GS)或堆栈段寄存器(SS)中。 (可以使用指令MOV、POP、LDS、LES、LFS、LGS和LSS来载入段寄存器)。在把一个段选择符号载入进段寄存器中之前,处理器会进行特权级检查,见图4-20所示。它会把当前执行程式或任务的CPL、段选择符号的RPL和段描述符号的DPL进行比较。只有当段的DPL数值大於或等於CPL和RPL两者时,处理器才会把选择符号载入进段寄存器中。否则就会產生一个一般保护異常,並且不载入段选择符号。

可程式或任务可定址的区域随著其CPL改变而变化,当CPL是0时,此时所有特权级上的资料段都可被存取:当CPL是1时,只有在特权级1到3的资料段可被存取:当CPL是3时,只有处於特权级3的资料段可被存取。
另外,有可能会把资料保存在代码段中。例如,当代码和资料是在ROM中时。因此,有些时候我们会需要存取代码段中的资料。此时可以使用以下方法来存取代码段中的资料:
1.把非一致可读代码段的选择符号载入进一个资料段寄存器中。
2.把一致可读代码段的选择符号载入进一个资料段寄存器中。
3.使用代码段覆盖首码(CS)来读取一个选择符号已经在CS寄存器中的可读代码段。
存取资料段的相同规则也适用方法l。方法2则是总是有效的,因为一致代码段的特权级等同於CPL,而不管代码段的DPL。方法3也总是有效的,因为CS寄存器选择的代码的DPL与CPL相同。
当使用堆栈段选择符号载入SS段寄存器时也会执行特权级检查。这裡与堆栈段相关的所有特权级必须与CPL匹配。也即,CPL、堆栈段选择符号的RPL以及堆栈段描述符号的DPL都必须相同。如果RPL或DPL与CPL不同,处理器就会產生一个一般保护性異常。
4.5.3 代码段之间转移控制时的特权级检查
对于将程式控制权从一个代码段转移到另一个代码段,目标代码段的段选择符号必须载入进代码段寄存器(CS)中。作为这个载入行程的一部分,处理器会检测目标代码段的段描述符号並执行各种限长、类型和特权级检查。如果这检查都透过了,则目标代码段选择符号就会载入进CS寄存器,於是程式的控制权就被转移到新代码段中,程式将从EIP寄存器指向的指令处开始执行。
程式的控制转移使用指令JMP、RET、INT和IRET以及異常和中断机制来实现。異常和中断是一些特殊实现,将在后面描述,本节主要說明JMP、CALL和RET指令的实现方法。JMP或CALL指令可以利用一下四种方法之一来引用另外一个代码段:
▓ 目标运算元含有目标代码段的段选择符号;
▓ 目标运算元指向一个呼叫门描述符号,而该描述符号中含有目标代码段的选择号;
▓ 目标运算元指向一个TSS,而该TSS中含有目标代码段的选择符号;
▓ 目标运算元指向一个任务门,该任务门指向一个TSS,而该TSS含有目标代码段的选择符号;
下面描述前两种参照类型,后两种将放在有关任务管理一节中进行说明。
直接呼叫或跳转到代码段
JMP、CALL和RET指令的近转移形式只是在当前代码段中执行程式控制转移,因此不会执行特权级检查。JMP、CALL或RET指令的远转移形式会把控制转移到另外一个代码段中,因此处理器一定会之醒特权级检查。
当不透过呼叫门把程式控制权转移到另外一个代码段时,处理器会验证4种特权级和类型资讯,见图4-21所示:

▓ 当前特权级CPL。(这里,CPL是执行呼叫的代码段的特权级,即含有执行呼叫或跳转城市的代码段的CPL。)
▓ 含有被呼叫行程的目的代码段段描述符号中的描述符号特权级DPL。
▓ 目的代码段的段选择符号中的请求特权级RPL o
▓ 目的代码段描述符号中的一致性标志C。它确定了一个代码段是非一致代码段还是一致代码段。
处理器检查CPL、RPL和DPL的规则依赖於一致标志C的设置状态。当存取非一致代码段时(C=0),呼叫者(程式)的CPL必须等於目的代码段的DPL,否则将会產生一般保护異常。指向非一致代码段的段选择符号的RPL对检查所起的作用有限。RPL在数值上必须小於或等於呼叫者的CPL才能使得控制转移成功完成。当非一致代码段的段选择符号被载入进CS寄存器中时,特权级栏位不会改变,即它仍然是呼叫者的CPL。即使段选择符号的RPL与CPL不同,这也是正确的。
当存取一致代码段时(C=1),呼叫者的CPL可以在数值上大於或等於目的代码段的DPL。仅当CPL
出处:南方Linux

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/31/showart_680813.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP