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 ...
随机推荐
- Java并发编程(三)Thread类的使用
一.线程的状态 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以下这几个状态:创建(new).就绪(runnable).运行(running).阻塞(blocked).time wait ...
- Django基础篇--模板和路由分发
Django模板 首先什么是一个模板? 简单来说就是一个网页,可以被view响应给用户 目的是为了解决复杂的显示问题 2. 模板的设置问题 setting.py中的TEMPLATES配置 1)BACK ...
- 洗礼灵魂,修炼python(9)--灵性的字符串
python几大核心之——字符串 1.什么是字符串 其实前面说到数据类型时说过了,就是带有引号的参数,“”引号内的一切东西就是字符串,字符串又叫文本. 2.创建字符串的两种方式: 3.字符串的方法: ...
- sql 查询表格中多列重复的数据并显示该表的其他列
我们一般情况下通过分组函数group by来查询重复的列 ) R 但是查询出的结果不能显示该表的其他列 想要查询一张表中有多个列重复的数据且也要显示该表的其他列 SELECT M.* FROM [db ...
- 浅谈C#依赖注入
什么是依赖注入?不管是js中的一些前端框架还是,java,C#,php等中的一些后端开发框架中,都会涉及这个看着逼格略高的词语:依赖注入,越是看着好像很厉害的东西越是会让许多人学习产生恐惧,好像很厉害 ...
- VMware安装CentOS6
1. 搭建虚拟化环境常见故障讲解 2. 安装CentOS Linux系统 ……………… PS:运维老鸟教你安装centos6.5如何选择安装包 3. 远程连接LInux ip配置 注意:不用做任何修改 ...
- Nginx使用教程(一):下载并编译安装Nginx
安装依赖 <br\>我们已经选择下载程序源代码进行手动编译,而不是使用软件包管理器(如Yum,Aptitude或Yast)进行安装. 这个选择有两个原因. 首先,软件包可能不包含在您的Li ...
- Java对XML文件解析方式之一_SAX
SAX(org.xml.sax) Simple API for XML,以事件的形式通知程序,对Xml进行解析. SAX技术的介绍:SAX是一种以事件驱动的XML api,由它定义的事件流可以指定 ...
- python第五十三课——time模块
1.time.datatime.calendar模块的引入讲解(重视) Unix时间戳(timestamp):返回的是数值类型数据(float值), 概念:记录了从1970年00点00分00秒至今的秒 ...
- UVA1600-Patrol Robot(BFS进阶)
Problem UVA1600-Patrol Robot Accept:529 Submit:4330 Time Limit: 3000 mSec Problem Description A rob ...