《intel开发手册卷1》学习笔记1

1、操作模式

IA-32架构支持三种基本操作模式:保护模式、实地址模式和系统管理模式。操作模式决定了哪些指令和体系结构功能是可访问的:

        1)保护模式:该模式是处理器的自然状态。保护模式的功能之一是能够在受保护的多任务环境中直接执行“实地址模式”8086软件。这个特性被称为虚拟8086模式,尽管它实际上不是处理器模式。Virtual-8086模式实际上是一种受保护的模式属性,可以为任何任务启用。

        2)实地址模式:该模式实现了带有扩展的英特尔8086处理器的编程环境(例如切换到保护模式或系统管理模式的能力)。处理器在上电或复位后被置于实地址模式。

        3)系统管理模式(SMM):该模式为操作系统或执行程序提供了一种透明的机制,用于实现特定于平台的功能,如电源管理和系统安全。当外部SMM中断引脚(SMI#)被激活或从高级可编程中断控制器(APIC)接收到SMI时,处理器进入SMM。

英特尔64架构增加IA-32e模式。IA-32e模式有两个子模式:

        兼容模式(IA-32e模式的子模式):兼容模式允许大多数传统16位和32位应用程序在64位操作系统下无需重新编译即可运行。为简洁起见,兼容子模式在IA-32架构中称为兼容模式。兼容模式还支持64位模式和受保护模式支持的所有权限级别。在虚拟8086模式下运行或使用硬件任务管理的传统应用程序将无法在此模式下工作。兼容模式由操作系统(OS)基于代码段启用。这意味着单个64位操作系统可以支持在64位模式下运行的64位应用程序,并支持在兼容模式下运行的传统32位应用程序(未针对64位进行重新编译)。兼容模式类似于32位保护模式。应用程序只能访问线性地址空间的前4gb。兼容模式使用16位和32位地址和操作数大小。与保护模式一样,该模式允许应用程序使用PAE(物理地址扩展)访问大于4gb的物理内存。

        64位模式(IA-32e模式的子模式)—该模式使64位操作系统能够运行为访问64位线性地址空间而编写的应用程序。为简便起见,64位子模式在IA-32架构中称为64位模式。64位模式将通用寄存器和SIMD扩展寄存器的数量从8个扩展到16个,通用寄存器扩展到64位。该模式还引入了一个新的操作码前缀(REX)来访问寄存器扩展。操作系统基于代码段启用64位模式。它的默认地址大小是64位,默认操作数大小是32位。使用REX操作码前缀和操作数大小覆盖前缀,可以逐个指令地覆盖默认操作数大小。

2、基本执行环境概述

在 IA-32 处理器上运行的任何程序或任务都有一组资源,用于执行指令和存储代码、数据及状态信息。这些资源(如图 3-1 所示)构成了 IA-32 处理器的基本执行环境。英特尔 64 处理器支持 IA-32 处理器的基本执行环境,以及 IA-32e 模式下的类似环境,它可以执行 64 位程序(64 位子模式)和 32 位程序(兼容性子模式)。基本执行环境由处理器上运行的应用程序和操作系统或执行程序共同使用。

        地址空间 :在 IA-32 处理器上运行的任何任务或程序都可以寻址最大 4 GB 字节(2^{32}字节)的线性地址空间和最大 64 GB 字节(2^{36} 字节)的物理地址空间。

        基本程序执行寄存器 :8个通用寄存器、6个段寄存器、EFLAGS 寄存器和 EIP(指令指针)寄存器组成了一个基本的执行环境,在此环境中可以执行一系列通用指令。这些指令对字节、字和双字整数进行基本整数运算,处理程序流控制,对位和字节串进行操作,并对内存寻址。

        x87 FPU 寄存器 : 8 个 x87 FPU 数据寄存器、x87 FPU 控制寄存器、状态寄存器、x87 FPU 指令指针寄存器、x87 FPU 操作数(数据)指针寄存器、x87 FPU 标记寄存器和 x87 FPU 操作码寄存器为操作单精度、双精度和双扩展精度浮点数值、字整数、双字整数、四字整数和二进制编码十进制 (BCD) 数值提供了执行环境。x87 浮点运算单元(FPU)具有高性能浮点处理能力,可用于图形处理、科学、工程和商业应用。它支持浮点、整数和打包 BCD 整数数据类型,以及 IEEE 浮点运算标准 754 中定义的浮点处理算法和异常处理架构

        MMX 寄存器:8个 MMX 寄存器支持对 64 位打包字节、字和双字整数执行单指令、多数据(SIMD)操作。

        XMM 寄存器:8 个 XMM 数据寄存器和 MXCSR 寄存器支持对 128 位打包的单精度和双精度浮点数值以及 128 位打包的字节、字、双字和四字整数执行 SIMD 操作。

        YMM 寄存器 :YMM 数据寄存器支持对 256 位打包的单精度和双精度浮点数值以及 256 位打包的字节、字、双字和四字整数执行 256 位 SIMD 操作。

        边界寄存器:BND0-BND3 寄存器分别存储与内存缓冲区指针相关的下限和上限(各 64 位)。它们支持英特尔 MPX 指令的执行。

        BNDCFGU 和 BNDSTATUS:BNDCFGU配置边界检查的用户模式MPX操作,BNDSTATUS提供了由MPX操作导致的#BR的附加信息。

        堆栈:为了支持函数或子例程调用以及函数或子例程之间的参数传递,在执行环境中包括了堆栈和堆栈管理资源。堆栈位于内存中。

除了基本执行环境中提供的资源,IA-32体系结构还提供以下资源作为其系统级体系结构的一部分。它们为操作系统和系统开发软件提供广泛的支持。

        I/O端口:IA-32架构支持输入/输出(I/O)端口之间的数据传输。

        控制寄存器:5个控制寄存器(CR0至CR4)决定处理器的工作模式和当前执行任务的特征。

        内存管理寄存器:GDTR、IDTR、任务寄存器和LDTR指定保护模式内存管理中使用的数据结构的位置。

        调试寄存器:调试寄存器(DR0至DR7)控制并允许监控处理器的调试操作。

        存储器类型范围寄存器(mtrr):mtrr用于为存储器区域分配存储器类型。

        特定型号寄存器(MSR):处理器提供多种特定型号寄存器,用于控制和报告处理器性能。几乎所有MSR都处理与系统相关的功能,并且不能被应用程序访问。这个规则的一个例外是时间戳计数器。

        机器检查寄存器:机器检查寄存器由一组控制、状态和错误报告MSR组成,用于检测和报告硬件(机器)错误。

        性能监控计数器:性能监控计数器允许监控处理器性能事件。

3、64位模式执行环境

64位模式的执行环境类似于基本执行环境(本文第2节)。以下段落描述了二者之间的一些差异:

        地址空间:在IA-32处理器上以64位模式运行的任务或程序可以寻址高达2^{64}字节的线性地址空间和高达2^{52}字节的物理地址空间。软件可以向CPUID查询处理器支持的物理地址大小。

        基本程序执行寄存器 :可用的通用寄存器(GPR)数量为 16 个。通用寄存器宽 64 位,支持对字节、字、双字和四字整数的操作。对字节寄存器的访问统一到最低的 8 位。指令指针寄存器变为 64 位。EFLAGS 寄存器扩展到 64 位,称为 RFLAGS 寄存器。RFLAGS 的高 32 位被保留。RFLAGS 的低 32 位与 EFLAGS 相同。

        XMM 寄存器 :共有 16 个 XMM 数据寄存器,用于 SIMD 操作。

        YMM 寄存器 :共有 16 个用于 SIMD 操作的 YMM 数据寄存器。

        堆栈: 堆栈指针大小为 64 位。堆栈大小不受 SS 描述符中的位控制(在非 64 位模式中),也不能由指令前缀覆盖指针大小。

        控制寄存器 :控制寄存器扩展至 64 位。新增了一个控制寄存器(任务优先级寄存器:CR8 或 TPR)。

        调试寄存器:调试寄存器扩展到 64 位。

        描述符表寄存器 :全局描述符表寄存器(GDTR)和中断描述符表寄存器(IDTR)扩展为 10 字节,可容纳完整的 64 位基址。本地描述符表寄存器(LDTR)和任务寄存器(TR)也扩展到可保存完整的 64 位基址。

4、IA-32内存模型

当使用处理器的内存管理功能时,程序并不直接寻址物理内存。相反,它们使用三种内存模型之一访问内存:平面、分段或实地址模式: •

        平面内存模型 :内存对于程序来说是一个单一的、连续的地址空间(图 3-3)。该空间称为线性地址空间。代码、数据和堆栈都包含在这个地址空间中。线性地址空间是可字节寻址的,地址从 0 到 2^{32} -1连续运行(如果不是在 64 位模式下)。线性地址空间中任何字节的地址称为线性地址。

        分段内存模型:内存对于程序来说是一组称为段的独立地址空间。代码、数据和堆栈通常包含在单独的段中。为了寻址段中的字节,程序发出逻辑地址。它由段选择器和偏移量组成(逻辑地址通常称为远指针)。段选择器标识要访问的段,偏移量标识该段地址空间中的字节。在 IA-32 处理器上运行的程序最多可以寻址 16,383 个不同大小和类型的段,每个段最大可达 2^{32}字节。在内部,为系统定义的所有段都被映射到处理器的线性地址空间。为了访问内存位置,处理器将每个逻辑地址转换为线性地址。这种翻译对于应用程序来说是透明的。使用分段内存的主要原因是为了提高程序和系统的可靠性。例如,将程序的堆栈放置在单独的段中可以防止堆栈增长到代码或数据空间并分别覆盖指令或数据

         实地址模式内存模型:这是Intel 8086 处理器的内存模型。它支持提供与在 Intel 8086 处理器上运行的现有程序的兼容性。实地址模式使用分段内存的特定实现,其中程序和操作系统/执行程序的线性地址空间由每个大小高达 64 KB 的段数组组成。实地址模式下线性地址空间的最大大小为2^{20}字节。

当使用 IA-32 架构的分页机制(启用分页)时,线性地址空间被划分为映射到虚拟内存的页面。然后,虚拟内存页根据需要映射到物理内存中。当操作系统或执行程序使用分页时,分页机制对于应用程序是透明的。应用程序看到的只是线性地址空间。

5、基本寄存器

IA-32 架构提供了 16 个基本程序执行寄存器,用于一般系统和应用程序编程(见图 3-4)。这些寄存器可以分组如下:

         通用寄存器:这8个寄存器可用于存储操作数和指针。

         段寄存器:这些寄存器最多可容纳6个段选择器。

         EFLAGS(程序状态和控制)寄存器: EFLAGS 寄存器报告正在执行的程序的状态,并允许对处理器进行有限(应用程序级)控制。

         EIP(指令指针)寄存器:EIP寄存器包含一个32位指针,指向下一条要执行的指令。

5.1、通用寄存器

32 位通用寄存器EAX、EBX、ECX、EDX、ESI、EDI、EBP 和ESP 用于以下用途:

         • 逻辑和算术运算的操作数。

        • 用于地址计算的操作数。

        • 内存指针

尽管所有这些寄存器都可用于操作数、结果和指针的一般存储,但在引用 ESP 寄存器时应小心。 ESP 寄存器保存堆栈指针,一般情况下不应将其用于其他目的。

通用寄存器的特殊用途如下:

        • EAX — 操作数和结果数据的累加器。

        • EBX — 指向DS 段中数据的指针。

        • ECX — 字符串和循环操作的计数器。

        • EDX — I/O 指针。

        • ESI — DS 寄存器所指向段中数据的指针;字符串操作的源指针。

        • EDI — 指向 ES 寄存器所指向的段中的数据(或目标)的指针;字符串操作的目标指针。

        • ESP — 堆栈栈顶指针(在SS 段中)。

        • EBP — 指向堆栈栈底的指针(在SS 段中)。

在64位模式下,有16个通用寄存器,默认操作数大小为32位。然而,通用寄存器能够使用 32 位或 64 位操作数。如果指定 32 位操作数大小:EAX、EBX、ECX、EDX、EDI、ESI、EBP、ESP、R8D - R15D 可用。如果指定 64 位操作数大小:RAX、RBX、RCX、RDX、RDI、RSI、RBP、RSP、R8-R15 可用。 R8D-R15D/R8-R15 代表8个新的通用寄存器

所有这些寄存器都可以按字节、字、双字和四字级别进行访问。 REX 前缀用于生成 64 位操作数大小或引用寄存器 R8-R15。

5.2、段寄存器

段寄存器(CS、DS、SS、ES、FS和GS)保存16位段选择器。段选择器是一个特殊的指针,用于标识内存中的段。要访问内存中的特定段,该段的段选择器必须存在于适当的段寄存器中。

如何使用段寄存器取决于操作系统或执行程序使用的内存管理模型的类型。当使用平面(未分段)内存模型时,段寄存器加载指向重叠段的段选择器,每个段从线性地址空间的地址0开始(见图3-6)。这些重叠的段构成了程序的线性地址空间。通常会定义两个重叠的段:一个用于代码,另一个用于数据和堆栈。CS段寄存器指向代码段,所有其他段寄存器指向数据和堆栈段。

当使用分段内存模型时,每个段寄存器通常加载不同的段选择器,以便每个段寄存器指向线性地址空间中的不同段(见图3-7)。因此,在任何时候,程序都可以在线性地址空间中访问多达六个段。要访问某个段寄存器未指向的段,程序必须首先将要访问的段的段选择器加载到段寄存器中。

每个段寄存器都与三种存储类型之一相关联:代码、数据或堆栈。例如,CS寄存器包含代码段的段选择器,其中存储了正在执行的指令。处理器使用由CS寄存器中的段选择器和EIP寄存器的内容组成的逻辑地址从代码段中获取指令。EIP寄存器包含下一条要执行的指令代码段内的偏移量。应用程序不能显式加载CS寄存器。相反,它是由改变程序控制的指令或内部处理器操作(如过程调用、中断处理或任务切换)隐式加载的

DS、ES、FS和GS寄存器指向四个数据段。四个数据段的可用性允许高效和安全地访问不同类型的数据结构。例如,可能会创建四个单独的数据段:一个用于当前模块的数据结构,另一个用于从更高级别模块导出的数据,第三个用于动态创建的数据结构,第四个用于与另一个程序共享的数据。要访问额外的数据段,应用程序必须根据需要将这些数据段的段选择器加载到DS、ES、FS和GS寄存器中

SS寄存器包含堆栈段的段选择器,其中存储了当前正在执行的程序、任务或处理程序的过程堆栈所有堆栈操作都使用SS寄存器来查找堆栈段与CS寄存器不同,SS寄存器可以显式加载,这允许应用程序设置多个堆栈并在它们之间切换

 64 位模式下,分段功能一般(但不完全)被禁用,从而创建一个扁平的 64 位线性地址空间。处理器将 CS、DS、ES、SS 的段基数视为零,创建的线性地址等于有效地址。FS 和 GS 段是例外,在某些线性地址计算中,它们的段寄存器(保存段基数)可用作额外的基寄存器。

5.3、EFLAFGS寄存器的标志位

32 位 EFLAGS 寄存器包含一组状态标志、一个控制标志和一组系统标志,如下图所示。

当挂起任务时(使用处理器的多任务处理功能),处理器会自动将 EFLAGS 寄存器的状态保存在挂起任务的任务状态段 (TSS) 中。当将自身绑定到新任务时,处理器会使用新任务 TSS 中的数据加载 EFLAGS 寄存器。当调用中断或异常处理程序时,处理器会自动将 EFLAGS 寄存器的状态保存在程序堆栈上。当通过任务切换处理中断或异常时,EFLAGS 寄存器的状态将保存在 TSS 中以供挂起的任务使用。

EFLAGS 寄存器的状态标志(位 0、2、4、6、7 和 11)指示算术指令(例如 ADD、SUB、MUL 和 DIV 指令)的结果。状态标志功能包括:

        CF(位 0) 进位标志 — 如果算术运算在结果的最高有效位中生成进位或借位,则设置该标志;否则清除。该标志指示无符号整数算术的溢出情况。它也用于多精度算术。

        PF(位 2)奇偶校验标志 — 如果结果的最低有效字节包含偶数个 1 位,则设置该标志;否则清除。

        AF(位 4)辅助进位标志 — 如果算术运算从结果的第 3 位生成进位或借位,则设置该标志;否则清除。该标志用于二进制编码的十进制 (BCD) 算术。

        ZF(位 6)零标志 — 如果结果为零则置位;否则清除。

        SF(位 7)符号标志 — 设置为运算结果的最高有效位,即有符号整数的符号位。 (0 表示正值,1 表示负值。)

         OF(位 11)溢出标志 — 如果整数结果太大正数或太小负数(不包括符号位)而无法容纳,则设置该标志。目标操作数;否则清除。该标志指示有符号整数(二进制补码)算术的溢出情况

状态标志允许单个算术运算生成三种不同数据类型的结果:无符号整数、有符号整数和 BCD 整数。如果算术运算的结果被视为无符号整数,则 CF 标志指示超出范围的情况(进位或借位);如果被视为有符号整数(二进制补码数),则 OF 标志表示进位或借位;如果将 AF 标志视为 BCD 数字,则表示进位或借位。 SF 标志指示有符号整数的符号。 ZF 标志指示有符号或无符号整数零。

在64位模式下,EFLAGS被扩展到64位并称为RFLAGS。 RFLAGS 寄存器的高 32 位被保留。 RFLAGS的低32位与EFLAGS相同。

使用通用寄存器作为基址或索引组件受到以下方式的限制:

         • ESP 寄存器不能用作索引寄存器。

        • 当ESP 或EBP 寄存器用作基址寄存器时,SS 段是默认段。除此之外,DS 段是默认段

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/833999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac 电脑安装 Raptor 流程图软件的方法

0. 安装逻辑 (1)运行 raptor,本质上需要 mac 能够运行 windows 程序,因此需要安装 .NET Runtime 7.0,这是微软程序运行必须的文件。 (2)运行 raptor 还需要安装依赖文件 mono-libgdiplus。 &am…

RabbitMQ - 以 MQ 为例,手写一个 RPC 框架 demo

目录 前言 一、再谈自定义应用层协议 二、再谈 BrokerServer 三、再谈 Connection、Channel 四、Demo a)启动服务器 b)客户端连接 前言 本篇文章来自于笔者之前写过的一个系列 —— “根据源码,模拟实现 RabbitMQ” 系列&#xff0c…

Linux-笔记 常用命令

(持续更新) 1、压缩: tar -vcjf test1.tar.bz2 test1 tar -vczf test1.tar.gz test1 2、解压 tar -vxjf test1.tar.bz2 tar -vxzf test2.tar.gz 3、查找 find [路径] [参数] [文件名] : find / -name test* grep [参数] 关键字 路径&a…

JS中数组去重的几种方法

在JavaScript中,有多种方法可以实现数组去重。以下是一些常见的方法: 1,使用ES6的Set数据结构 Set数据结构只允许存储唯一的值(无论是原始值或者是对象引用),因此是数组去重的理想选择。 let arr [1, 2…

CentOs9编译C指令报错的一种解决方案

今天使用centos9编译c代码时,显示bash: gcc: command not found... 下图是我的报错页面,依据提示信息安装gcc之后依旧显示失败 找到其中一种解决方式,完美解决,供参考 输入以下指令更新软件包列表,这里需要等待几分…

MT3031 AK IOI

思路:把每个节点存到堆(大根堆)里。 如果节点放入后总时间没有超过m则放入堆中;如果总时间超过了,就看堆头元素是否比新元素大。如果大,则删除堆头(反悔贪心)。 注意别忘记开long l…

keystone学习小结

1 keystone middleware 1.1 工作流程 middleware在客户端和服务端之间,会拦截客户端请求并判断请求身份是否是正确合法的,若是,则继续将请求发给其他middleware或app 具体看,干了这些事 1将请求里的auth header去除&#xff0c…

毕业论文画图软件推荐

给大家分享了一些毕业论文画图软件,仅供参考! 1.Microsoft visio 推荐指数:⭐️⭐️⭐️⭐️ ✅优点: -功能真的多且强大 -反正功能真的挺全的比较细节,但好像没有模板? ❌缺点: -不好安装,需要激活使用 -文件大&…

爬虫:爬取豆瓣电影

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 上篇我们将到如何利用xpath的规则,那么这一次,我们将通过案例来告诉读者如何使用Xpath来定位到我们需要的数据,就算你不懂H5代码是怎么个嵌套或者十分复…

C++新特性-线程

主要内容 thread、condition、mutexatomicfunction、bind使用新特性实现线程池(支持可变参数列表)异常协程其他 1 C11多线程thread 重点: join和detach的使用场景thread构造函数参数绑定c函数绑定类函数线程封装基础类互斥锁mutexconditi…

计算机组成原理网课笔记

无符号整数的表示与运算 带符号整数的表示与运算 原反补码的特性对比 移码

搜狗输入法 PC端 v14.4.0.9307 去广告绿化版.

软件介绍 搜狗拼音输入法作为众多用户计算机配置的必备工具,其功能的全面性已为众所周知,并且以其高效便捷的输入体验受到广大使用者的青睐。然而,该软件在提供便利的同时,其内置的广告元素常常为用户带来一定的干扰。为此&#…

Linux中动态库的用法及优缺点?怎样制作动态库和静态库?

一、什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C、java、Pascal等语言。gcc支持多种硬件平台. 在 Linux…

PostgreSQL-常用函数和操作符

PostgreSQL 中文社区 PL/pgSQL 是 PostgreSQL 中的一种存储过程语言,它支持许多常用的函数和操作符。下面列举了一些常用的 PL/pgSQL 函数和操作符: 1. 常用函数: RAISE:用于在存储过程中抛出异常。 RAISE EXCEPTION Error oc…

航空电子ARINC818采集卡

ARINC818采集卡是针对航空电子数字视频总线协议(Avionics Digital Video BUS,ADVB)的高性能PCIe视频光纤采集测试设备。ARINC818协议主要应用于机载设备间的实时高清图像传输,目前已经成功应用于多款民用、军用机型当中&#xff0…

渐进淡出背景个人导航页源码(火影版)

渐进淡出背景个人导航页源码&#xff08;火影版&#xff09; 效果图部分源码领取源码下期更新预报 效果图 部分源码 <!DOCTYPE html> <html> <head> <!--小K网 www.xkwo.com --><meta charset"UTF-8"><title>火影版个人主页<…

每日一博 - 闲聊架构设计中的多级缓存设计

文章目录 方法论概述客户端缓存应用层缓存服务层缓存缓存设计的注意事项总结 思维导图戳这里 方法论概述 从客户端到服务层&#xff0c;缓存的应用广泛而重要。通过合理的缓存设计&#xff0c;能够有效地提高系统的性能并降低延迟。 客户端缓存 在客户端层面&#xff0c;浏览…

多模态融合技术现实世界中的挑战与研究进展

在人工智能的诸多领域中&#xff0c;多模态融合技术正逐渐成为连接不同信息源的桥梁。这种技术通过整合来自视觉、听觉、文本等多种模态的数据&#xff0c;旨在提供更为丰富和精确的预测结果。然而&#xff0c;现实世界的数据往往是不完美和不完整的&#xff0c;这给多模态融合…

[微信小程序] 入门笔记1-滚动视图组件

[微信小程序] 入门笔记1-滚动视图组件 1.页面&组件&渲染 在小程序是由一个个页面page组成, 而页面又是由一个个组件component组成.和网页类似,这里的组件指的就是输入框<input>,按钮<button>,文本<text>,图片<image>等元素.如果你学过网页一…

【YOLOv9算法原理简介】

YOLOv9算法原理 单阶段检测器:YOLOv9延续了YOLO系列的单阶段检测器设计,即在单次前向传播中同时预测边界框和类别概率,这使得它能够实现快速的检测速度。通用高效层聚合网络(GELAN) :YOLOv9引入了一种新的模型架构GELAN,它通过高效的层聚合块和计算模块,以较小的参数量…