首先讲一下什么是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的更多相关文章

  1. Intel x86_64 Architecture Background 2

    这里是在学习Intel x86_64体系架构时学习到的一些概念,记录下来以供日后参考.如果有错的地方,欢迎指正! CPU上下文切换(context switch): 这个概念第一次听到对我来说是完全陌 ...

  2. Intel x86_64 Architecture Background 3

    多层次的cache结构解决了CPU和DRAM之间处理速度不一致的问题,在Intel体系架构下,CPU核心和主存DRAM之间有着三层的cache.其中一层缓存L1和二层缓存L2在CPU核心(core)中 ...

  3. 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 百度了好久没找到相关信息,最后看见官网文档 ...

  4. InfiniBand 与Intel Omni-Path Architecture

    Intel Omni-Path Architecture (OPA) 是一种与InfiniBand相似的网络架构 可以用来避免以下PCI总线一些缺陷: 1.由于采用了基于总线的共享传输模式,在PCI总 ...

  5. Intel Omin-Path Architecture 搭建调优与测试

    OPA在Centos上的搭建 1. 首先确认Omni-Path Host Fabric Interfaces (HFIs) # yum install –y pciutils # lspci -vv ...

  6. [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理

    [中英对照]Introduction to DPDK: Architecture and Principles | DPDK概论: 体系结构与实现原理   Introduction to DPDK: ...

  7. 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 ...

  8. Intel MIC

    http://en.wikipedia.org/wiki/Intel_MIC Intel MIC From Wikipedia, the free encyclopedia     Intel Man ...

  9. Game Engine Architecture 4

    [Game Engine Architecture 4] 1.a model of multiple semi-independent flows of control simply matches ...

随机推荐

  1. 【转载】Android RecyclerView 使用完全解析 体验艺术般的控件

    崇拜下鸿洋大神,原文地址:http://blog.csdn.net/lmj623565791/article/details/45059587 概述 RecyclerView出现已经有一段时间了,相信 ...

  2. git下载、安装、连接github

    0.下载git 官网下载速度慢,下载不下来阿里云下载地址:https://npm.taobao.org/mirrors/git-for-windows/ 1.安装git linux:在命令行直接输入: ...

  3. python爬虫之pyquery学习

    相关内容: pyquery的介绍 pyquery的使用 安装模块 导入模块 解析对象初始化 css选择器 在选定元素之后的元素再选取 元素的文本.属性等内容的获取 pyquery执行DOM操作.css ...

  4. January 10th, 2018 Week 02nd Wednesday

    No need to have a reason to love you. Anything can be a reason not to love you. 喜欢你,不需要什么理由:不喜欢你,什么都 ...

  5. Python进阶(一)

    完成慕课网的python基础学习以后,大约花了三天时间,平均每天一个小时,总结了一些比较好的例题和思想方法,下面来学习python进阶吧 参考廖雪峰官方课程 函数 python官方函数调用文档 定义默 ...

  6. 使用 React-Sketchapp 管理你的设计资产

    首发:https://www.yuque.com/jingwhale/blog/do37mc 最近在整理设计规范的过程中,尝试使用了 Airbnb 公司发布的 react-sketchapp 工具.从 ...

  7. 关于hover和after、before合用

    通常hover后面跟的选择器,都是在myClass结构之下 的dom元素. 如果想在myClass下添加after等,就需要两个::号. 注:after/before是属于myclass的下级元素,并 ...

  8. jeDeta 日历控件的那些坑

    经过亲自测试 jeDeta 发现 jeDeta 还是有坑的: 1.参数 options 里面的 format 有很多种格式 API 里面写的是 format: 'YYYY-MM-DD hh:mm:ss ...

  9. django生命周期和事件委派

    这是事件委派如果不用事件委派   直接绑定的话,新添加的按钮不会有删除或者编辑的功能 上面是事件委派的代码 新添加的编辑按钮可以弹出123 django生命周期: 这是Django的生命周期 首先会通 ...

  10. PHP数组转为树的算法

    一.使用引用 function listToTree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0) { $tree = ...