[转载]long mode 下的 interrupt/trap gate

interrupt 与 trap gate 格式是一样的,只是 descriptor type 不一样而已。与 x86 的 interrupt / trap gate 的所不同的是:base 扩展为 64 位、额外增加了 IST 域。

前面提过,由于 interrupt / trap gate 只能放在 IDT 表中,不存在 64/32 位代码共存的现象,所以,interrupt / trap gate 的高半部分的 type 域不需为 0000,而保留未用。

6.1.6.1、 interrupt gate 与 trap gate 的细微区别

interrupt 与 trap 是在格式上是完全一致,区别在于:当响应 interrupt gate 时,processor 将 Rflags.IF 清为 0,将中断标志清为 0,表示在 interrupt 例程执行完毕之前是不能响应其它的中断(可屏敝中断)。
当响应 trap gate 时,processor 不会对 Rflags.IF 标志进行修改。表示在执行 trap 例程时,可以响应其它的中断。

6.1.6.2、 IST(Intrrupt Stack Table)的使用

新增的 IST 域共 3 位,可表示 1 ~ 7 个 ID 值,代表 IST1 ~ IST7。当 IST = 0 时,表示无 IST,或者不使用 IST 功能。
IST1 ~ IST7 是索引 ID 值,在 long mode 下的 64 位 TSS segment 的 IST1 ~ IST7 中进行索引,前面已经提过在 TSS segment 中新增了 IST ~ IST7 共 7 个域,每个域为 64 位值,每个 64 位值是 stack pointer (RSP)。
假如在 interrupt/trap gate descriptor 中的 IST 设为 2,那么当响应这个 interrupt/trap 例程时,processor 据此在 TSS 中索引到 IST2,将 TSS 的 IST2 加载到 rsp 中,从而使用这个特定的 stack pointer 。
但是,若发生了权限的改变,即发生了 stack 的切换,最终仍是从相应权限的 stack pointer 加载 rsp 值,如:目标 interrupt 例程是 0 级的代码,而调用者为 3 级代码。这时发生 stack 的切换,processor 那么将从 RSP0 中加载 rsp。

IST 的价值是为 interrupt / trap 例程提供一个特定的 stack 环境。这是在未发生 stack 切换的前提下。IST 为 0 则表示不使用特定的 stack 环境。

6.1.6.3、 interrupt / trap gate 调用流程

long mode 下的 interrupt / trap gate 与 32 位下的调用流程有很大差别:

1、在 x86 下 32 位的 interrpt / trap gate 的 base(offset) 并不是真正的 interrupt / trap 例程的执行入口,执行入口首需经 interrupt/trap gate 的 selector 域得出目标 code segment 的 descriptor,然后,目标 code segment descriptor 的 base 值加上 interrupt / trap gate 的提供 offset 值,最终才形成真正的执行入口。
当然,现在绝大部分的 OS 已经在 code segment descriptor 的 base 设为 0,实际上等于 interrupt / trap gate 的 offset 就是例程的执行入口。

2、在 long mode 下的 intterupt / trap gate 的 base(offset)提供的是真正的例程执行入口地址。而 interrupt / trap gate 的 selector 仅仅只是起了权限检查的作用。当过通了权限检查后,直接将 offset 加载到 rip 进行执行。

时间: 2024-10-16 16:06:45

[转载]long mode 下的 interrupt/trap gate的相关文章

[转载]long mode 下的 call gate

6.1.4.  long mode 下的 call gate 6.1.4.1. 64 位的 call gate descriptor 中已经不支持 parameter count 域,offset 域被扩展至 64 位 base 值. 情景提示: 64 位的 call gate descriptor 的中 selector 域必须是一个 64 位代码的 selector,也就是说:这个 selector 指向的 code segment descriptor 中的 L 属性必须是 1,并且 de

[转载]window系统下TCP参数优化

注:此文转载自红黑联盟,最近服务器遇到周期性down掉的问题,拖了两三周请教了前辈之后才知道无关应用和数据库的事情,是tcp设置的问题.从网上找个这篇文章,解释的很不错.有兴趣请至红黑联盟翻阅原文. TCP连接的状态与关闭方式及其对Server与Client的影响 http://www.2cto.com/net/201304/206071.html 通常会采用修改注册表的方式改进Windows的系统参数.下面将为大家介绍Windows系统下的TCP参数优化方式,适用于Windows 2003.W

转载:Ubuntu下deb包的安装方法

转载:Ubuntu下deb包的安装方法,http://blog.csdn.net/kevinhg/article/details/5934462 deb是debian linus的安装格式,跟red hat的rpm非常相似,最基本的安装命令是:dpkg -i file.deb dpkg 是Debian Package的简写,是为Debian 专门开发的套件管理系统,方便软件的安装.更新及移除.所有源自Debian的Linux发行版都使用dpkg,例如Ubuntu.Knoppix 等.以下是一些

转载:Linux下执行SVN命令时提示错误:Valid UTF-8 data

在Linux下执行svn add *时出现如下错误: svn:  Valid UTF-8  data(hex: 4b)followed by invalid UTF-8 sequence(hex:  fc 63 68  65) 出现这个错误是因为svn库里有文件的名字不是utf-8编码的,这种情况对于中文来说很常见.比如在自己的windows上建了一个中文名字的文件,就会使这种情况. 几经周折,才找到解决办法: 首先,执行命令: ls * | file -/dev/stdin:  ISO-885

(转载)Linux下安装配置MySQL+Apache+PHP+WordPress的详细笔记

Linux下安装配置MySQL+Apache+PHP+WordPress的详细笔记 Linux下配LMAP环境,花了我好几天的时间.之前没有配置过,网上的安装资料比较混乱,加上我用的版本问题,安装过程中出现了一些错误,经过好几次安装,翻了好多资料,最后找出问题的所在,才把环境搭建好,对于高手来说,这或许不算什么,但对于一个刚入门的新人,却是不一样了,这篇文章记录着我的一些笔记,希望对于那些刚刚入门的人们有所帮助,仅作为参考. 安装首先我们得获得MySQL,Apache,PHP,WordPress

转载:Ununtu下中文乱码解决方案

转载: 添加中文字符编码: $sudo vim /var/lib/locales/supported.d/local #添加下面的中文字符集 zh_CN.GBK GBK zh_CN.GB2312 GB2312 zh_CN.GB18030 GB18030 使其生效: $sudo dpkg-reconfigure locales vim: 打开vim的配置文件,位置在/etc/vim/vimrc 在其中加入 set fileencodings=utf-8,gb2312,gbk,gb18030 set

[转载]警惕UNIX下的LD_PRELOAD环境变量

警惕UNIX下的LD_PRELOAD环境变量 陈皓 前言 也许这个话题并不新鲜,因为LD_PRELOAD所产生的问题由来已久.不过,在这里,我还是想讨论一下这个环境变量.因为这个环境变量所带来的安全问题非常严重,值得所有的Unix下的程序员的注意. 在开始讲述为什么要当心LD_PRELOAD环 境变量之前,请让我先说明一下程序的链接.所谓链接,也就是说编译器找到程序中所引用的函数或全局变量所存在的位置.一般来说,程序的链接分为静态链接和 动态链接,静态链接就是把所有所引用到的函数或变量全部地编译

【转载】wondows下wget的使用

原文地址:http://www.cnblogs.com/Randy0528/archive/2011/10/21/2219831.html 感觉要放弃windows了,,,哎,,,, 下载windows下使用的wget,然后复制到任何目录下,如果希望像使用 windows底下命令一样不使用绝对路径使用命令可以将wget.exe复制到/windows/system32下或是将wget所在目录添加到环境 变量中,至于扎添加环境变量找Google.大多数使用wget都很简单:只需要输入wget+具体的

【转载】Windows下VSCode编译调试c/c++

懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Windows下VSCode便携式c/c++环境 http://blog.csdn.net/c_duoduo/article/details/52083494 下载解压即可食用. 本文转载自http://www.2cto.com/kf/201606/516207.html 原文如下: 这篇文章为blackkitty记录在windows下使用vscode编译调试c/c++的超级详细过程 首先看效果 设置断点,变量监视,调用堆栈的