![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
[转]x86 & x64体系
文章平均质量分 72
ProgrammingRing
这个作者很懒,什么都没留下…
展开
-
long mode 模式下的中断服务例程
转自:点击打开链接在 long mode 下,gate 是 16 字节的,并取消了对 task gate 的支持。即 IDT 的 entry 是 16 字节的,所以:gate = IDTR.base + vector * 16。 在 long mode 下,code segment descriptor 的 L、D、C 以及 DPL 有效,其它域无效。由于 base 强制为 0,转载 2012-04-04 13:48:21 · 1122 阅读 · 0 评论 -
call/jmp offset 段内调用
转自:点击打开链接段内的调用/跳转的特性: 不改变 CS,也就是不用重新加载 code segment descriptor,当然也就不需要进行权限的检查,但是这里需要做 segment 的 limit 检查,检测到越 segment limit 会产生 #GP 异常。 由于在段时调用,所以使用 call offset 时,processor 仅会做 push eip 的处转载 2012-04-04 13:52:39 · 1020 阅读 · 0 评论 -
stack segment 的访问
转自:点击打开链接基于 stack 的访问都将引发 stack 访问控制检查,对于 stack 的访问控制比一般的 data segment 访问检查要严格。用简单的式子表达为:if (RPL == DPL && CPL = DPL) { /* 通过检查,允许访问,加载 descriptor 进入 SS */} else { /* 拒绝访转载 2012-04-04 13:54:39 · 1865 阅读 · 0 评论 -
long mode 下的 TSS 和 task gate
转自:点击打开链接long mode 已经不支持使用 TSS 机制进行任务切换。TSS 必须存在的唯一原因依然是:需要提供每个权限级别的 stack 指针。但是,由于不支持 TSS 任务切换机制,所以,long mode 下的 TSS segment 和原来的 TSS segment 有很大的改变。1、long mode 下的 TSS segment 去掉了必要的执行环境,包括转载 2012-04-04 13:55:58 · 735 阅读 · 0 评论 -
gate 的用法
转自:点击打开链接gate descriptor 给出了目标代码的访问途径。上面给出一个直观的访问途径图。这个途径就是:1、gate descriptor 的 selector 给出目标代码的 code segment descriptor2、由目标代码 code segment descriptor 的 base address 得出代码的 base 3、转载 2012-04-04 13:57:59 · 1775 阅读 · 0 评论 -
LDT descriptor
转自:点击打开链接显然,GDT(global descriptor table)是系统与所有进程共用的。相对于 LDT(local descriptor table)则是进程独享的。GPRs、selector registers、stack pointers、eflags、LDT descriptor、CR3 构成了一个进程的执行环境。 TSS segment 包含了上述几个环境资源转载 2012-04-05 09:04:03 · 775 阅读 · 0 评论 -
利用 TSS 机制切换到任何权限级别
转自:点击打开链接利用 TSS 机制可以进行任意权限级别的随意切换是基于:(1)在任何权限下可以更改 eflags.NT 标志位。(2)使用中断返回指令 iret 进行切换到更高级或更低级权限的代码。如下: pushfd /* 这条指令可以在 3 级执行 */ or转载 2012-04-05 09:04:21 · 742 阅读 · 0 评论 -
x86 的 TSS 任务切换机制
转自:点击打开链接segment descriptors 构建保护模式下的最基本、最根本的执行环境。system descriptors 则构建保护模式下的核心组件:1、TSS descriptor 提供硬件级的进程切换机制2、LDT descriptor 供进程使用多个 descriptor3、Gate descriptor 提供 processor 权限级别的切换机制。转载 2012-04-05 09:04:39 · 2755 阅读 · 0 评论 -
real 模式下访问 4G 地址空间
转自:点击打开链接在实模式下不受 1M 空间限制访问 4G 空间,实现这个目的仅仅需要一点小“技俩”,这就是某些资料上所说的 big mode2.1 原理 real mode -> protected mode -> real mode 在实模式转化为 protected 模式时,设置好该问 4G 空间的 descriptors,加载进相应的的转载 2012-04-05 09:07:15 · 684 阅读 · 0 评论 -
real 模式的思考
转自:点击打开链接1.1、real 模式、protected 模式以及 Long 模式的物理资源清楚认识这点: 从物理资源方面看:real 模式是 protected 模式的子集,而 protected 模式是 long 模式的子集。所以:real 模式、protected 模式以及 long 模式的物理资源是一样的。 pro转载 2012-04-05 09:07:32 · 675 阅读 · 0 评论 -
通过 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 任务切换机制不被支持。转载 2012-04-04 13:51:44 · 1140 阅读 · 0 评论 -
选择 conforming 还是 non-conforming ?
转自:点击打开链接code segment descriptor 的 C 位表示 code segment 是 conforming 还是 non-conforming 类型,C = 1 代表 conforming 类型,C = 0 代表 non-conforming。conforming 类型可以允许低权限向高权限转移,而不需要通过 call-gate。低权限向高权限的 non-conf转载 2012-04-04 13:50:27 · 1196 阅读 · 1 评论 -
使用 TSS selector 进行任务切换
转自:点击打开链接指令: call 0x20:00000000 jmp 0x20:00000000----------------------------------- selector 0x20 是个 TSS descriptor 的 selector。 TSS descriptor 与 segment descriptor 的格式一致,不同的是 ty转载 2012-04-04 13:50:00 · 1340 阅读 · 0 评论 -
canonical-address 地址形式
转自:点击打开链接canonical-address 地址形式就是:64 位的 linear address(virtual address)中的从 MSB(Most Significant Bit)最高有效位到第 63 位全是 0 或 1 的这种形式。看下面的地址: FFFF8010_bc001000:这是符合 canonical-address 的地址,MSB 是 b转载 2012-04-04 13:53:31 · 2057 阅读 · 0 评论 -
使用哪个 segment registers 进行数据的访问
转自:点击打开链接对于 code segment 的访问,都知道是使用 CS selector register 。对于 data segment 的访问,则是根据指令或内存的寻址方式来决定使用哪个 selector registers。1、对于串操作指令来说,在缺省的情况下:源串引用 DS 作为参考对象,目标串引用 ES 作为参考对象。 loadsd转载 2012-04-04 13:53:54 · 719 阅读 · 0 评论 -
long mode 下的 interrupt/trap gate
转自:点击打开链接interrupt 与 trap gate 格式是一样的,只是 descriptor type 不一样而已。与 x86 的 interrupt / trap gate 的所不同的是:base 扩展为 64 位、额外增加了 IST 域。 前面提过,由于 interrupt / trap gate 只能放在 IDT 表中,不存在 64/32 位代码共存的现象,所以,in转载 2012-04-04 13:55:34 · 1010 阅读 · 0 评论 -
使用 gate 构建保护模式的 protected 核心
转自:点击打开链接x86 下 segment 保护核心就是 gate 机制,x64 的 long 模式下 segment 保护有所弱化,AMD 号称 long 模式取消了 segment 机制,实际上,现阶段的的 x64 体系中,segment 机制是不可取消的。只不过是将平坦内存模式从软件层移到硬件层,等取于取消了 segment 机制。 现在的操作系统都将 protected 重转载 2012-04-04 13:58:28 · 836 阅读 · 0 评论 -
x86 windows2008 下的 paging 实例
转自:点击打开链接看一看 x86 的 windows server 2008 版本上的 pagingserver 版的 windows 使用了 2M paging kd> unt!KeUpdateSystemTime+0xed:816d502d fa cli816d502e 648b0d1c000000 mov转载 2012-04-05 09:05:23 · 540 阅读 · 0 评论 -
x64 win7 下的 paging 实例
转自:点击打开链接再看一看 win7 x64 体系中的 paging 实例:从 windbg 中摘录一段 win7 的 kernel 代码:kd> unt!KeSetProfileIrql+0x1306:fffff800`02bc7c36 33d2 xor edx,edxfffff800`02bc7c38 2401转载 2012-04-05 09:05:33 · 718 阅读 · 0 评论 -
x86 中的算术标志位运用
转自:点击打开链接sub x,y ===> 以此为例 一、用于符号数运算的标志: (OF、ZF、SF) 1、 (OF = 0) && (ZF = 0) && (SF = 0) ZF = 0 : 说明两个算术操作数不相等OF = 0 : 说明结果无溢出SF = 0 : 说明结果为正数-----------------------转载 2012-04-05 09:07:42 · 707 阅读 · 1 评论 -
调用后返回
转自:点击打开链接当目标代码执行完毕,需要返回控制权给原代码时,将产生返回控制权行为。返回控制权行为,比转移控制权行为简单得多。因为,一切条件已经在交出控制权之前准备完毕,返回时仅需出栈就行了。 1、 near call的返回近调用情况下,段不改变,即 CS 不改变,权限级别不改变。从栈中pop返回地址到EIP 寄存器时,需进行 limit 的检查。 2、转载 2012-04-05 09:08:08 · 550 阅读 · 0 评论 -
页级的保护措施
转自:点击打开链接一、 页的三种保护措施:★ 两种权限保护:supervisor(0、1及2级)和user(3级)★ 两种访问限制:read-only 及 read/write★ PAE 下的 No Exceute 属性保护 二、 supervisor/user保护措施★ PDE/PTE 的 U/S域,0时:supervi转载 2012-04-05 09:07:51 · 737 阅读 · 0 评论 -
x86控制转移及相关的权限检查
转自:点击打开链接■ 数据访问时的权限check一、 访问data segment时(ds、es、fs 及gs)1、 程序指令要访问数据时,data segment selector 被加载进 data segment register(ds、es、fs 和 gs)前,处理器会进行一系列的权限检查,通过了才能被加载进入segment register。处理器分为两步进行检查:转载 2012-04-05 09:08:41 · 738 阅读 · 0 评论 -
段式管理的几个相关寄存器
转自:点击打开链接 /* author: mik * project: pm_simulation (一个保护模式行为模拟器) * * sregister.h 这个文件描述段管理的几个相关寄存器的结构 */ #ifndef __SREGISTER__#define __SREGISTER__ /* 选择子共16位长 */ty转载 2012-04-06 07:49:33 · 773 阅读 · 0 评论 -
使用 task gate 进行任务切换
转自:点击打开链接指令: call 0x20:00000000 jmp 0x20:00000000----------------------------------- selector 0x20 是个 task gate 的 selector 这里使用 task gate 任务切换与使用 TSS selector 的情形基本一样。值得注意的转载 2012-04-04 13:49:32 · 963 阅读 · 0 评论 -
segmentation 情景分析
转自:点击打开链接用户程序 A 君,是某酒店公寓的新住户,该公寓有若干层,每层有若干寓所,还包括公用的日用百货仓库间,会所等公共设施,是一座自助式的电子化的公寓大厦。 这一天是用户程序 A 君,新入住公寓的日子,管理员 OS 交给了 A 君自己寓所的电子门匙,A 君要凭这条电子门匙在公寓的管理系统里找到自己的寓所。5.1、寻找 room 的 key:segme转载 2012-04-05 09:05:09 · 765 阅读 · 0 评论 -
x86 vista 下的 paging
转自:点击打开链接看一个实际的例子:kd> unt!InitBootProcessor+0x3df:81b3a6de fec8 dec al81b3a6e0 f6d8 neg al81b3a6e2 bfe0df8f81 mov edi,offset nt!ExpBootEnviro转载 2012-04-05 09:06:12 · 641 阅读 · 0 评论 -
堆栈的切换
转自:点击打开链接操作系统必须至少建立一个TSS,4个权限级别的堆栈结构(stack segment selector及stack pointer)必须被定义。 一、 堆栈及栈指针的权限级别:★ 3 级:stack selector及stack pointer存储在SS寄存器及 ESP 寄存器中★ 0、1及2级:相应的stack selector及stack转载 2012-04-05 09:08:18 · 880 阅读 · 0 评论 -
TSS的定义
转自:点击打开链接/* author: mik * project: pm_simulation (一个保护模式行为模拟器) * * tss.h 这个文件描述TSS块 */ #ifndef __TSS__#define __TSS__ /* 定义 TSS */typedef struct TASK_STATE转载 2012-04-06 07:49:15 · 1253 阅读 · 0 评论 -
x86 控制转移权限检查精要
一、 直接转移(far call及 far jmp)直接转移通过执行一条 call 或 jmp指令,在段内转移不需selector近跳转,段间转移通过selector(不带gate或 tss)远跳转,CPL不改变。 权限检查的4个要素:★ CPL:当前运行级别(也就是CS.CPL)★ RPL:门符选择子(RPL for code descriptor)★转载 2012-04-05 09:08:26 · 894 阅读 · 0 评论 -
AMD64 ABI 的几个主要特性
1、7个通用寄存器(rdi,rsi,rdx,rcx,r8,r9 和 rax)依次用作函数传递参数。2、rsp 及 rbp 用于管理堆栈3、r10 及 r11 用于临时寄存器4、5个通用寄存器(r12,r13,r14,r15 及 rbx)由被调用方保存转载 2012-04-05 09:08:34 · 1592 阅读 · 0 评论 -
描述符相关的几个系统结构
转自:点击打开链接/* author: mik * project: pm_simulation (一个保护模式行为模拟器) * * descriptor.h 这个文件描述段管理的几个相关寄存器的结构 */ #ifndef __DESCRIPTOR__#define __DESCRIPTOR__ /* 通用的段描述符结构,转载 2012-04-06 07:49:26 · 1364 阅读 · 0 评论 -
proected 模式
转自:点击打开链接x86 的 protected 模式是构建在段机制上,实质上 protected 模式应称为 segmentation protected 模式。整个 protected 模式的核心是 Privilege(权限),众多机制都是围绕 privilege 这个核心元素来构建。3.1、 保护的意图 在久远的 real 模式下的 dos 平台,还是那种“硬件为软转载 2012-04-05 09:07:04 · 551 阅读 · 0 评论 -
使用 int n 调用系统例程
转自:点击打开链接IDT(Interrupt Descriptor Table)仅能存放 interrupt-gate、trap-gate 和 task-gate。指令: int 0x80----------------------------------- 0x80 是 vector (中断向量号) 在 x86 下,gate-descriptor转载 2012-04-04 13:49:01 · 558 阅读 · 0 评论 -
long mode 模式下 system/gate descriptor 的疑惑
转自:点击打开链接1、 32 位的 system descriptor 与 64 位的 system descriptor(1)compatibility 模式下,LDT / TSS descriptor 还是原来的 32 位的 descriptor,与原来 x86 的 LDT / TSS 意义一致。(2)64 bit 模式下,LDT / TSS descriptor 扩展转载 2012-04-04 13:51:00 · 1012 阅读 · 0 评论 -
使用 call/jmp 直接调用/跳转目标 code segment
转自:点击打开链接直接调用/跳转的形式是: call / jmp selector:offset 这里的 selector 是 code segment selector 直接使用 selector 来索引 code segment,这将引发 CS 的改变,code segment descriptor 最终会被加载到 CS 寄存器里。 在 code segment转载 2012-04-04 13:52:12 · 1360 阅读 · 0 评论 -
目标 code segment 的访问
转自:点击打开链接当程序中使用指令 call / jmp,以及通过 int 引发中断例程的执行,这将都是对目标的 code segment 进行访问,当通过权限的检查后程序将会跳转到目标的 code segment 进行执行。 在 code segment 的访问过程中涉及到权限级别的改变,stack 的改变等问题。访问目标 code segment 的几种情形:转载 2012-04-04 13:53:08 · 887 阅读 · 0 评论 -
data segment 的访问
转自:点击打开链接这里的 data segment 访问控制针使用对 DS、ES、FS 以及 GS selector register 进行访问,不包括 SS selector register,stack segment 访问与一般的 data segment 有些差别。 以 DS 为例代表所有的 data segment 访问(ES、FS 以及 GS),需要的权限条件是:RP转载 2012-04-04 13:55:08 · 1165 阅读 · 0 评论 -
long mode 下的 call gate
转自:点击打开链接6.1.4、 long mode 下的 call gate6.1.4.1、 64 位的 call gate descriptor 中已经不支持 parameter count 域,offset 域被扩展至 64 位 base 值。情景提示: 64 位的 call gate descriptor 的中 selector 域必须转载 2012-04-04 13:56:45 · 637 阅读 · 0 评论 -
x64 下的 segmentation 情形
转自:点击打开链接6.1、 x64 下的物理资源及系统数据结构6.1.1、 segment registers x64 体系在硬件级上最大限度地削弱了 segmentation 段式管理。采用平坦内存管理模式,因此体现出来的思想是 base 为 0、limit 忽略。 但是,x64 还是对 segmentation 提供了某种程度上的支持。体现在 FS 与 GS 的与众转载 2012-04-04 13:57:25 · 1013 阅读 · 0 评论