技术控

    今日:126| 主题:49289
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] Segmentation Protection in Intel Processor

[复制链接]
你穿过的墙 发表于 2016-9-30 18:30:00
195 8

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
最近继续看Intel手册,第三卷的第3章和第5章,感觉又学到很多,包括一些之前一直困扰我的问题。这里做一个整理和总结吧。
   这里先推荐一篇博文, CPU Rings, Privilege, and Protection ,感觉写的非常好,思路很清晰。建议可以先阅读一下。
  首先提一个问题,为什么在当前的Linux操作系统里面,用户态的程序不能访问内核的数据,不能执行内核的代码,同时不能执行一些特权指令呢?在回答这个问题之前,首先需要明白一个概念,到底什么是用户态和内核态。
  特权级(privilege levels)

  特权级是处理器硬件内部维护的一个状态,软件无法直接修改。Intel处理器一共有四个特权级,从高到低分别由0到3表示,即数字越低,表示特权越高,而每个数字即表示了当前CPU运行在哪个特权级上。一般情况下(特别是在64位系统中),系统只会用到这四个特权级中的两个,即0和3,其中0就是所谓的内核态,而3就是用户态。
  所以说,一个程序运行在用户态的意思,就是该程序所运行的CPU里面的特权级的状态为3,内核态就表示运行内核的CPU的状态为0,仅此而已。当然,这个特权级会和其它的一些机制组合在一起,在触发某些操作的时候进行检查。这个会在之后详细说明。
  软件如何知道自己运行在哪个特权级上

   按道理来说,特权级是CPU内部的一个状态,软件是无法对它进行直接修改的。但是Intel为软件提供了一个机制,使得软件能够知道自己当前运行在哪个特权级上,简单来说,就是通过段寄存器 cs 来获得该信息。 cs 说白了就是一个16位的寄存器,长成这样:
   
Segmentation Protection in Intel Processor-1 (处理器,levels,操作系统,Intel,Linux)

   也就是说,它最后两个bits就表示当前CPU所处的特权级状态。软件可以通过直接读取 cs 寄存器获取该信息:
         read_cs.c          [code]static inline unsigned int read_cs(void)
{
  unsigned int cs;
  asm volatile ("mov %%cs, %0" : "=r" (cs));
  return cs;
}
[/code]       如果读出来最后两个bits是0,则表示运行在内核态,如果是3,则表示运行在用户态。
  基于特权级的保护机制

  有了特权级的概念,我们就可以比较清楚地了解Intel处理器本身提供的那些保护机制了,总体来说,该保护机制主要由三个部分组成。
  
       
  • 特权指令的执行   
  • Memory的保护   
  • I/O的保护  
  对于I/O的保护,我们这里暂且不表,这里主要考虑的是前面两个部分。
  特权指令的执行

  在Intel的处理器中,一共有16条指令是用户态不能直接执行的(只有内核态可以执行),这些指令如下:
  
       
  • LGDT — Load GDT register.   
  • LLDT — Load LDT register.   
  • LTR — Load task register.   
  • LIDT — Load IDT register.   
  • MOV (control registers) — Load and store control registers.   
  • LMSW — Load machine status word.   
  • CLTS — Clear task-switched flag in register CR0.   
  • MOV (debug registers) — Load and store debug registers.   
  • INVD — Invalidate cache, without writeback.   
  • WBINVD — Invalidate cache, with writeback.   
  • INVLPG —Invalidate TLB entry.   
  • HLT— Halt processor.   
  • RDMSR — Read Model-Specific Registers.   
  • WRMSR —Write Model-Specific Registers.   
  • RDPMC — Read Performance-Monitoring Counter.   
  • RDTSC — Read Time-Stamp Counter.  
  如果在CPL非0的状态下执行这些指令,将会产生一个general-protection exception (#GP) 。至于这些指令都是做什么的,这里也不一一解释了。
  Memory的保护

  这是这篇博文重点关注的内容,主要分为两个部分:Segmentation和Paging。
  段机制(Segmentation)

  下图是利用段机制将内存分成不同段(代码段,数据段等)的一个例子:

Segmentation Protection in Intel Processor-2 (处理器,levels,操作系统,Intel,Linux)

  在这个设计中,有很多段寄存器,通过每个段寄存器可以分别找到其对应的段描述符,然后获得相应的段的基地址,大小,权限等信息。
  下图是一个利用段机制寻址的例子:
1234下一页
友荐云推荐




上一篇:ES proposal: global
下一篇:Get Started With Firebase for Android
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

拽拽桃桃 发表于 2016-10-1 18:01:29
出问题先从自己身上找原因,别一便秘就怪地球没引力.
回复 支持 反对

使用道具 举报

草帽农夫范 发表于 2016-10-6 13:58:03
开往春天的坦克!
回复 支持 反对

使用道具 举报

刘高佳 发表于 2016-11-3 19:24:17
是金子,总会花光的;是镜子,总会反光的……
回复 支持 反对

使用道具 举报

邓君 发表于 2016-11-6 14:01:45
经验告诉哥,不能弯腰捡肥皂啊!
回复 支持 反对

使用道具 举报

uc1026 发表于 2016-11-6 19:57:56
夏天就是不好,穷的时候我连西北风都没得喝……
回复 支持 反对

使用道具 举报

杨元庆 发表于 2016-11-13 21:49:34
OMG!介是啥东东!!!
回复 支持 反对

使用道具 举报

袁斌 发表于 2016-11-15 17:16:42
楼主,一路顺风!
回复 支持 反对

使用道具 举报

深海之水 发表于 2016-11-18 22:02:43
不是我劝着我自己,我特么早和这个世界翻脸了。
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表