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 ...
随机推荐
- scrapy系列(四)——CrawlSpider解析
CrawlSpider也继承自Spider,所以具备它的所有特性,这些特性上章已经讲过了,就再在赘述了,这章就讲点它本身所独有的. 参与过网站后台开发的应该会知道,网站的url都是有一定规则的.像dj ...
- Maven 安装 on centos7
本文演示如何在CentOS7上安装maven. 1 准备工作 1.1 进入官网下载栏目 http://maven.apache.org/download.cgi 找到下载列表中 Binary tar. ...
- python常用模块json
python jons模块 json模块 主要是解决数据格式的转换问题,比如python接收到json对象需要转换为python对象,供python处理,亦或者python数据需要发送到其给其他客户端 ...
- sql语句进阶教程
转载自:http://blog.csdn.net/u011001084/article/details/51318434 最近从图书馆借了本介绍SQL的书,打算复习一下基本语法,记录一下笔记,整理一下 ...
- 【PAT】B1033 旧键盘打字(20 分)
#include<stdio.h> #include<algorithm> #include<ctype.h> using namespace std; bool ...
- linux 下正则匹配时间命名格式的文件夹
用正则表达式匹配时间格式命名的文件夹 ls mypath | grep -E "[0-9]{4}-[0-9]{1,2}" mypath为需要查询的目录 查询出来的文件夹格式为:例 ...
- Ulua对象管理方式
不管是C++中还是在C#中,在都绕不开一个问题:类对象怎么在Lua中使用的问题,还好Lua提供了Userdata以及ligh Userdata结构类型,通过扩展可以处理这方面的问题.现在的很多框架也大 ...
- Orcale的NVL、NVL2函数和SQL Server的ISNULL函数
Orcal 的 nvl函数 NVL(Expr1,Expr2)如果Expr1为NULL,返回Expr2的值,否则返回Expr1的值,Expr1,Expr2都为NULL则返回NULL NVL2(Expr1 ...
- Hunter -- 批量文件管理工具
一个简单工具, 用来进行批量文件的重命名, 更改后缀, 搜索特定后缀, 等 下载地址:http://download.csdn.net/download/kuangsun/7545179
- MSSQL Server 数据库备份还原常用SQL语句及注意
1.备份数据库 backup database db_name to disk='d:\db_name.bak' with format --通过使用with format可以做到覆盖任何现有的备份和 ...