Intel x86_64 Architecture Background 1
首先讲一下什么是Intel x86,x86是指intel的开发的一种32位指令集,从386开始时代开始的一直沿用至今,是一种cisc指令集。x84_64是x86 CPU开始迈向64位的时候,有2选择:1、向下兼容x86。2、完全重新设计指令集,不兼容x86。AMD抢跑了,比Intel率先制造出了商用的兼容x86的CPU,AMD称之为AMD64,抢了64位PC的第一桶金,得到了用户的认同。而Intel选择了设计一种不兼容x86的全新64为指令集,称之为IA-64(中文名为安腾),但是比amd晚了一步,而且IA-64也挺惨淡的,因为是全新设计的CPU,没有编译器,也不支持windows。后来不得不在时机落后的情况下也开始支持AMD64的指令集,但是换了个名字,叫x86_64,表示是x86指令集的64扩展,大概是不愿意承认这玩意是AMD设计出来的。也就是说实际上,x86_64,x64,AMD64基本上是同一个东西,我们现在用的intel/amd的桌面级CPU基本上都是Intel x86_64。
目前大多数的前沿研究都是基于64位的系统,如Graphene等等,因此本次学习一些 Intel x86_64相关的体系结构知识。操作系统利用虚拟化使各个应用进程安全的执行,互不影响。而该虚拟化两个关键的技术是:地址转化和软件特权级。
0x01. 计算模型
目前的计算机结构大多都是冯诺依曼式的,Intel架构也不例外。主要包含处理器、内存、输入输出设备等等。通过总线将这些设备连接起来,各个设备将消息发送到总线上,其它设备根据自身功能进行相应,比如:CPU从内存读取数据。处理器的内部寄存器一般由SRAM单元构成,而内存由DRAM单元构成。Intel架构使用了变长指令编码,因此指令只有从内存中读出来才知道其长度。
0x02. 软件特权级
理论上,软件的特权级分为ring0、ring1、ring2、ring3四个特权级,其中ring0的特权级最高,ring3的特权级最低。目前操作系统只包含ring0、ring3,也即内核级、用户级。而在基础设施及服务(IaaS)的云环境中,如Amazon EC2,CPU在4种不同的特权级中运行软件。其中包含:系统管理模式(SMM)、硬件虚拟化根模式(VMX root mode,hypervisor运行的模式)、硬件虚拟化非根模式(VMX Non-root mode, 运行Guest OS kernel)的ring0、硬件虚拟化非根模式(VMX Non-root mode,运行Guest App)的ring3。
0x03. 地址空间
Intel架构上的软件使用4种不同的物理地址空间访问计算机资源,分别是:寄存器地址空间、特定模型的寄存器(MSR)、内存地址空间、I/O端口地址空间。寄存器地址空间主要由寄存器名称构成,x86_64架构下的通用寄存器包含:RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP,注意和x86架构的寄存器区别。特定模型的寄存器主要用来配置CPU的操作。内存地址空间由2^36(64GB)到2^40(1TB)的地址构成,内存地址空间主要用于访问DRAM,有时也用来和内存映射的设备交互。关于内存映射,在计算机启动时,内存地址0xFFFFF000 - 0xFFFFFFFF(4GB最高的64KB)被映射到闪存设备,该设备包含的计算机启动时第一阶段的代码。I/O端口地址空间由2^16 I/O地址构成,I/O端口主要用于和外设交互。
0x04. 地址转化
Intel架构上的64位操作系统使用的地址转化模式叫做IA-32e,将48位的虚拟地址映射成52位的物理地址,其余位留作它用。地址转化过程由CPU内部特定的硬件:地址转化单元或者内存管理单元(MMU)执行。在地址转化的过程中,需要理解几个名词:逻辑地址、虚拟地址、物理地址。Intel架构中的分段机制使每个应用程序有独立的段,逻辑地址中的段选择符和偏移量在段描述符表中确定应用程序的虚拟地址;虚拟地址是应用程序固定的地址空间,应用程序执行时地址就是虚拟地址;物理地址是对内存中的单元进行编址,是代码和数据实际存储的地址。如果未开启分页机制,则虚拟地址就是物理地址;如果开启了分页机制,则虚拟地址需要通过页表进行转化。一般情况下,逻辑地址和虚拟地址不严格区分,有时虚拟地址也叫做线性地址。
0x05. 执行上下文
64位Intel架构的应用程序使用一系列的CPU寄存器和CPU交互。这些寄存器中的值构成了应用程序线程的状态,也即执行上下文。执行上下文是对应于线程的。一般情况下,一个应用进程有多个线程(至少一个主线程),也即有多个执行上下文。操作系统内核通过下上文切换在多个应用线程之间操作逻辑处理器。通常的做法是:保存当前寄存器中的值构成线程的执行上下文,然后用以前保存的线程上下文恢复寄存器的值。
0x06. 段寄存器
Intel 64位架构之所以获得广泛的应用,是因为它能兼容以前32位架构的应用程序。而段寄存器在其中的发挥了一定作用。段寄存器主要有:代码段(CS)、数据段(DS)、栈段(SS)、目的地址段(ES)、未命名段(FS、GS)。由于Intel架构原来的16位历史原因,段寄存器被表示位16位的值,叫做段选择符。其中的高13位是一个索引值,用于在段描述表中定位段描述符;低2位是选择符的特权环数值,叫做请求特权级(RPL)。每一个段寄存器有一个隐藏的段描述符,由基址、限长、类型信息组成。其中段描述符位于段描述符表中,段描述符表中分为全局描述符表(GDT)和局部描述符表(LDT)。现代内核只使用一个描述符表,也即全局描述符表。
0x07. 特权级切换
任何有软件特权级的架构都必须提供一个方法,使低特权级的软件调用高特权级的服务。比如:应用软件需要系统内核的辅助来执行网络或磁盘读写,即要求访问特权内存或I/O地址空间。Intel x86_64目前架构特权切换机制涉及到ring0、ring3、VMX root三种特权级,ring0与ring3之间的特权级切换:通过中断(Interrupt)、错误(Fault)和系统调用(SYSCALL)从ring3切换到ring0;通过指令返回(IRET)和调用返回(SYSRET)从ring0切换到ring3。ring0和VMX root之间特权级切换:通过VMEXIT VMFUNC、VM exit从ring0切换到VMX root;通过虚拟机启动(VMLAUCH)和虚拟机恢复(VMRESUME)从VMX root切换到ring0。
以上内容转载自:Intel x86_64 Architecture Background
Intel x86_64 Architecture Background 1的更多相关文章
- Intel x86_64 Architecture Background 2
这里是在学习Intel x86_64体系架构时学习到的一些概念,记录下来以供日后参考.如果有错的地方,欢迎指正! CPU上下文切换(context switch): 这个概念第一次听到对我来说是完全陌 ...
- Intel x86_64 Architecture Background 3
多层次的cache结构解决了CPU和DRAM之间处理速度不一致的问题,在Intel体系架构下,CPU核心和主存DRAM之间有着三层的cache.其中一层缓存L1和二层缓存L2在CPU核心(core)中 ...
- Atlas 安装报错 package Atlas-2.2.1-1.x86_64 is intended for a x86_64 architecture
安装atlas 报错: package Atlas-2.2.1-1.x86_64 is intended for a x86_64 architecture 百度了好久没找到相关信息,最后看见官网文档 ...
- InfiniBand 与Intel Omni-Path Architecture
Intel Omni-Path Architecture (OPA) 是一种与InfiniBand相似的网络架构 可以用来避免以下PCI总线一些缺陷: 1.由于采用了基于总线的共享传输模式,在PCI总 ...
- Intel Omin-Path Architecture 搭建调优与测试
OPA在Centos上的搭建 1. 首先确认Omni-Path Host Fabric Interfaces (HFIs) # yum install –y pciutils # lspci -vv ...
- [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理
[中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理 Introduction to DPDK: ...
- Optimizing subroutine calls based on architecture level of called subroutine
A technique is provided for generating stubs. A processing circuit receives a call to a called funct ...
- Intel MIC
http://en.wikipedia.org/wiki/Intel_MIC Intel MIC From Wikipedia, the free encyclopedia Intel Man ...
- Game Engine Architecture 4
[Game Engine Architecture 4] 1.a model of multiple semi-independent flows of control simply matches ...
随机推荐
- postmortem报告
beta阶段与alpha阶段的比较 beta阶段与alpha阶段的比较主要从个人方面和团队方面进行总结. 以下是我们的队员对于自己在beta阶段的实践和alpha阶段的改进的总结. 成员林静雯认为,自 ...
- sqlserver 2017 docker安装(启动代理)
从 Docker Hub 中拉出 SQL Server 2017 Linux 容器映像. docker pull microsoft/mssql-server-linux:2017-latest 运行 ...
- 【第三篇】SAP ABAP7.5x新语法之程序结构&SubScreen
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文地址:SAP ABAP7.5x系列之程序结构& ...
- sql server 无法sa登录解决办法
大概流程:在SQL软件里面设置解决 大概流程: 打开 控制面板 -> 管理工具 -> 服务..... 详细参考地址: https://blog.csdn.net/github_351606 ...
- oracle数据库用户基本操作
每个数据库都有一系列的用户,为了访问数据库,用户必须使用用户名等信息先连接上数据库实例,oracle数据库提供了多种方式来管理用户安全.创建用户的时候,可以通过授权等操作来限制用户能访问的资源以及一些 ...
- break和continue语句(初学者)
1.break语句可以从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句. 一般形式:break: break不能用于循环语句和switch语句之外的任何其他语句中. 注意:(1)break ...
- GUI概述与Frame演示
java 图形化界面的对象存在这两个包中: java.awt :Abstract WindowsToolkit(抽象窗口工具包)需要调用本地系统方法实现功能,属重量级控件 javax.swing:在a ...
- P2626 斐波那契数列(升级版)(合数的质数分解, 大数为素数的概率十分小的利用)
题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1)=1f(1) = 1 f(1)=1 f(2)=1f(2) = 1f(2)=1 f(n)=f(n−1)+f(n−2)f(n) = f ...
- vs2012中如何显示代码行号
打开一个项目,里面没有显示行号 打开工具-选项 选择文本编辑器-C# 在行号前面上打钩 点击确定,就可以看到代码前面显示出行号 6 还可以按此办法添加其他类型文件的代码行号
- mysql数据表的字段操作
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, ` ...