[转载] data segment 的访问

这里的 data segment 访问控制针使用对 DS、ES、FS 以及 GS selector register 进行访问,不包括 SS selector register,stack segment 访问与一般的 data segment 有些差别。

  以 DS 为例代表所有的 data segment 访问(ES、FS 以及 GS),需要的权限条件是:RPL(DS.RPL) <= DPL 且 CPL(CS.DPL) <= DPL。   这里的 RPL 就是 DS.RPL,即:使用 ds selector 进行 data segment 访问时,使用什么级别的 RPL。CPL 就是当前 CS selector 里的 DPL,代表 processor 处于什么权限级别。   DPL 就是目标 data segment descriptor 所定义的访问 data segment 所需要的权限。
用简单的式子表达为:

if (RPL <= DPL && CPL <= DPL) {   /* 通过权限检查,允许访问,加载 descriptor 进入 DS */
} else {   /* 拒绝访问,产生 #GP 异常 */   goto do_#GP }

  式子中的比较表示在数字上大小关系。数字越大权限越低,所以 RPL <= DPL 是判断 RPL 权限级别是否大于 DPL 的权限级别   RPL 和 CPL 的权限极别必须大于或等于 DPL 的权限级别。
  在得到允许访问后的后续处理:目标 data segment descriptor 将加到了 DS 寄存器中。在不改变访问的目标 data segment 的情况下,processor 不会对 DS 进行更新,也就是:不会得新加载 data segment descriptor。   DS 寄存器保持着内部的 descriptor 记录不变,直至到更新 DS 寄存器。因此,对同一个 data segment 的访问仅需要加载 1 次 descriptor 。这种情况对于所有的 selector registers 都是一样的。

情景提示:   当 processor 发现 descriptor 的 P 标志位为 0 时,将引发 #NP 异常。所以系统必须要设定 descriptor 的 P 标志位为 1,processor 不会对 P 标志位进行更改。   系统将 P 标志置为 0,有时会特定的用途,大多数OS 会在软件中会引发类似 segment falut 错误提示,指示程序员犯了某些错误。

7.1.1.1、 x64 的 long mode 下 data segment 的访问
  在 long mode 下的兼容模式与 x86 下的 data segment 的控制访问检查并无两样。但是在 64 bit 模式下就完全改变了。
在 64 bit 模式下:   

processor 不对 data segment 的访问进行任何的权限检查!data segment descriptor 中仅有 P 标志位是有效的,其它都无效。也就是 DS、ES、FS、GS 以及 SS 中除 P 属性有效外,其它都是无效的。   所有基于 DS、ES 以及 SS 的 data segment 的 base 是无效的,被强制为 0。而基于 FS 与 GS 的 data segment 的 base 是有效的,故 FS 与 GS 的 data segment 可以定位在 64 位地址空间的任何位置。

所以:   

1、所有的 data segment 的访问都不进行权限检查,包括 DS、ES、FS、GS 以及 SS。这是因为,在 64bit 下所有的 data segment descriptor 的 DPL 属性是无效的。   

2、所有的 data segment 的访问也不进行 type、limit 检查,这些属性都是无效的。64 bit 下,所有的 data segment 都是 Readable/writable 属性。所有的 data segment 都具有 64 位地址空间。   

3、所有的地址 limit 检查都变为 canonical-address 的地址形式检查。

时间: 2025-01-02 23:02:31

[转载] data segment 的访问的相关文章

[转载]stack segment 的访问

基于 stack 的访问都将引发 stack 访问控制检查,对于 stack 的访问控制比一般的 data segment 访问检查要严格. 用简单的式子表达为: if (RPL == DPL && CPL = DPL) { /* 通过检查,允许访问,加载 descriptor 进入 SS */ } else { /* 拒绝访问,引发 #GP 异常 */ goto do_#GP } 访问 stack 仅限于同级访问,RPL.CPL 以及 DPL 三者必须相等.即使 0 级代码也不能访问 3

[转载]目标 code segment 的访问

当程序中使用指令 call / jmp,以及通过 int 引发中断例程的执行,这将都是对目标的 code segment 进行访问,当通过权限的检查后程序将会跳转到目标的 code segment 进行执行. 在 code segment 的访问过程中涉及到权限级别的改变,stack 的改变等问题. 访问目标 code segment 的几种情形: 1.call / jmp offset 在段内直接 call / jmp,不改变目标 code segment 2.call / jmp code_

编译器错误消息: CS0122: “System.Data.DataRow.DataRow(System.Data.DataRowBuilder)”不可访问,因为它受保护级别限制

编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS0122: "System.Data.DataRow.DataRow(System.Data.DataRowBuilder)"不可访问,因为它受保护级别限制 源错误:   行 17: 行 18: DataTable dt = new DataTable(); 行 19: System.Data.DataRow r = new DataRow(); 行

iOS Core data多线程并发访问的问题

大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的特殊性,与大家分享一下. 这个问题似乎在7.0.1以前的版本上并不存在:不过后来我升级版本到了7.0.4.app的模型很简单,主线程在前台对数据库进行读写,而后台线程不断地做扫描(只读).为此每个线程中各创建了一个NSManagedObjectContext. 这个模型其实有点奇怪,因为普遍的模型是

“Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象

目录: “Zhuang.Data”轻型数据库访问框架(一)开篇介绍 “Zhuang.Data”轻型数据库访问框架(二)框架的入口DbAccessor对象 先来看一段代码 DbAccessor dba = DbAccessor.Create(); var dt = dba.QueryDataTable("select * from sys_product where productid=#Id#",new {Id=1}); Console.WriteLine(DataTableUtil.

java 中的内存分为四个部分:stack(栈),heap(堆),data segment

http://www.qdmm.com/BookReader/113167,54166719.aspx http://www.qdmm.com/BookReader/113167,54166867.aspx http://www.qdmm.com/BookReader/113167,54166868.aspx http://www.qdmm.com/BookReader/113167,54166869.aspx http://www.qdmm.com/BookReader/113167,5416

对路径“bin\MySql.Data.xml”的访问被拒绝的解决方法

刚刚从tfs上链接好路径,下载好项目代码之后,清空解决方案后,可能遇到这样的问题.(从项目某文件复制某文件xml类型的时候权限不够,被拒绝) 无法将文件"E:\NetWorkPace\Permission\packages\EntityFramework.6.1.1\lib\net45\MySql.Data.xml"复制到"bin\MySql.Data.xml".对路径"bin\MySql.Data.xml"的访问被拒绝. 解决方法: 你应该是清

[转载]通过 call gate 访问目标 code segment

直接 call / jmp 目标 code segment 不能改变当前的 CPL,若要 call / jmp 高权限的 code segment 必须使用 call gate,在 x86 下还要可以 call / jmp TSS descriptor 或者 call / jmp task gate,但在 64 bit 模式下 TSS 任务切换机制不被支持. 同样以下面的指令为例:(1) call  0x20:0x00040000 (2) jmp 0x20:0x00040000 --------

转载【OpenCV】访问Mat中每个像素的值(新)

转载一个讲Mat像素访问的,仅记为笔记. y原文链接为:http://blog.csdn.net/xiaowei_cqu/article/details/19839019 目录(?)[-] Color Reduce 方法零ptr和操作符 方法一ptr和指针操作 方法二ptr指针操作和取模运算 方法三ptr指针运算和位运算 方法四指针运算 方法五ptr位运算以及imagecols imagechannels 方法六连续图像 方法七continuouschannels 方法八Mat _iterato