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 ...
随机推荐
- HDFS Sink使用技巧
1.文件滚动策略 在HDFS Sink的文件滚动就是文件生成,即关闭当前文件,创建新文件.它的滚动策略由以下几个属性控制: hdfs.rollInterval 基于时间间隔来进行文件滚动,默认是30, ...
- [20180118]tstats的问题.txt
[20180118]tstats的问题.txt --//关于使用tstats收集处理统计信息,可以看链接http://blog.itpub.net/267265/viewspace-1987839/ ...
- json数据 二级联动
<head> <link href="static/bootstrap-3.3.5-dist/css/bootstrap.css" rel="style ...
- 修改sqlserver2008数据库的排序规则 (转)
修改sqlserver2008数据库的排序规则 (转) 修改SQL server 2008服务器排序规则 SQL Server 2008安装好后,发现服务器排序规则不对,又不想重装SQL S ...
- Eclipse配置和使用Maven
一.ecplise配置Maven 1.下载eclipse的Maven插件.(有些eclipse版本中已经集成了此Maven插件,可以不用下载). 需要下载m2eclipse插件. 2.安装m2ecli ...
- Kali Linux 初始化配置:Apache2 /SSH /FTP
Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统.Kali Linux预装了许多渗透测试软件,包括nmap .Wireshark .John the Ripper, ...
- Python3编写网络爬虫12-数据存储方式五-非关系型数据库存储
非关系型数据库存储 NoSQL 全称 Not Only SQL 意为非SQL 泛指非关系型数据库.基于键值对 不需要经过SQL层解析 数据之间没有耦合性 性能非常高. 非关系型数据库可细分如下: 键值 ...
- Linux 下安装 Tomcat 出现拒绝访问的情况
此外也无法调用 java -version 查看版本号 ./shutdown 时:提示找不到 JDK 的某个文件夹 ./startup 时:却启动正常 访问 8080 端口时,显示拒绝访问 解决方法: ...
- GUI_鼠标事件
所有的组件都有鼠标和键盘监听器 import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import ja ...
- php 安装xdebug进行调试(phpstorm)
一.下载xdebug xdebug官网:https://xdebug.org/download.php 在选择下载哪个版本的xdebug的时候需要注意了,下面有两种方法,让你准确的下载自己环境对应的x ...