本文参考文档是《64-ia-32-architectures-software-developer-vol-1-manual》(本文之后都以Vol1来指代),介绍了x86架构的基础。这些基础内容几乎所有的程序员都或多或少听说过,但是很多时候都不会直接与它们打交道。

本文按照自己的理解简要说明这些基础内容,不保证完成的正确性。对于某些自已也不太了解的内容,会直接贴出原文。

执行环境
什么是执行环境?简单来说执行环境就是系统或者程序执行所需要的资源。

当谈到执行环境的时候,我们还需要引入CPU的运行模式,不同的模式下执行环境也是不一样的。

x86平台目前的架构有32位和64位两种,而不同的架构支持的运行模式也是不一样的,不过基本上64位的能够兼容32位。

目前x86平台的主流架构已经是64位的了,本文之后的内容默认以64位为基础。

x86平台目前支持的运行模式有如下的几种:

1. 保护模式;

2. 实模式;

3. 系统管理模式;

4.1. IA-32e兼容模式;

4.2. IA-32e64位模式;

其中4.1和4.2统称为IA-32e模式(即IA-32 Extension),它是在64位运行模式之中引入的,而前面的三种在32位模式时就已经引入。

64位运行模式简单来说就是增加了系统访问空间,扩展了32位模式的寄存器的尺寸,并增加了部分寄存器,上述所说的系统访问空间,寄存器等其实就是这里要说的执行环境了。

执行环境包含如下的内容:

地址空间:它是指从CPU角度来看能够访问到的一段地址,一般直接称为系统地址,是从0开始的一段线性地址,对于32位系统来说,它的地址就是从0到2的32次方;对于64位系统来说就是从0到2的64次方。与线性地址对应的还有一个物理地址,表示的是系统上内存的大小。线性地址和物理地址的对应关系大致如下(来自CoffeeLake CPU EDS):

这里需要注意几点:

1. 系统地址跟实际的物理内存地址之间在大多数模式下都没有什么对应关系,即使是实模式下,很多系统地址也是映射到其它模式上;

2. 上图中的CoffeeLake当然是一个64位的架构,但是可以看到它的系统地址最大并不是2的64次方,而是512G,即2的39次方,这在Vol1中有说明:

而在CoffeeLake的EDS中也指定了具体的位数:

基础编程寄存器:如通用寄存器(AX、BX等),段寄存器(CS、DS等),FLAG寄存器,IP寄存器以及其它通用寄存器,这些寄存器在32位和64位架构下的名称和尺寸都会不一样。

FPU寄存器:CPU内部集成了一个浮点执行单元,同时就有一部分的寄存器给这个单元用,包括数据寄存器、控制寄存器、状态寄存器等等。

MMX寄存器、XMM寄存器、YMM寄存器:这一堆寄存器都是用来处理SIMD操作的,SIMD操作指的是一条命令就可以操作多个数据。

Bounds寄存器、BNDCFGU、BNDSTATUS:这些是用于内存保护的寄存器。

以上的部分如下图所示:

堆栈:这个不用多介绍,就是存放函数入参和临时变量的地方,它通过段寄存器SS指定位置,而实际指向的是一段内存或者Cache。

以上是最基本的执行环境,但是光有这一部分还无法使x86能够正常工作,还需要下面额外的执行环境:

IO端口:当通过CPU访问外部设备,我们可以使用系统地址,此时这段系统地址已经被映射到了外部的设备,所以访问该段空间就相当于访问外部的设备,这种方式称为Memory-Maped IO,这种方式是最常用的;除此之后还有一种比较老的方式,就是通过另外一段独立的IO地址(这段地址相比于系统地址要小很多,通常就64K),这里要讲的就是这段IO地址的访问。它使用的就是这里的IO端口,而使用的指令也不同于系统地址的访问,是由in/out这两个汇编指令来访问的。

控制寄存器:x86架构提供了5个控制寄存器(CR0-CR4),它们用来控制CPU的执行模式和特性等,这里直接列出这5个寄存器:

上述每一BIT的意义可以参考《64-ia-32-architectures-software-developer-system-programming-manual》手册中的说明。

内存管理寄存器:为了实现内存管理,需要系统创建一些数据结构来进行管理,这些数据结构就需要通过内存管理寄存器来访问,这些寄存器包括GDTR(Global Descriptor Table Register)、IDTR(Interrupt Descriptor Table Register)、LDTR(Local Descriptor Table Register)和TR(Task Register):

具体的使用可以参考《64-ia-32-architectures-software-developer-system-programming-manual》手册中的说明。

调试寄存器:这部分寄存器是用来监控CPU的DEBUG操作的,总共有8个,如下图所示:

具体的使用可以参考《64-ia-32-architectures-software-developer-system-programming-manual》手册中的说明。

MSR:全称是Model Specific Registers,它们的作用很多,且根据不同的x86架构和平台会有差异,可以直接参考《64-ia-32-architectures-software-developer-model-specific-registers》(即Vol 4)。

MTRRs:全称是Memory Type Range Resisters,它们用来控制物理地址某个范围的类型。这里说的类型有以下的几种:

public Startup(IConfiguration configuration, ILoggerFactory loggerFactory) {
Configuration = configuration;

Fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|/document.db;Pooling=true;Max Pool Size=10")
.UseAutoSyncStructure(true)
//自动同步实体结构到数据库
.UseLazyLoading(true)
//开启延时加载,导航属性

.UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText))
//跟踪SQL执行语句
.Build();
}

public IConfiguration Configuration { get; }
public IFreeSql Fsql { get; }

public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddMvc();

services.AddSingleton<IFreeSql>(Fsql);

var builder = new ContainerBuilder();

builder.RegisterFreeRepository(
filter => filter
.Apply<ISoftDelete>(www.sanxinyuLevip.com "www.wanmeiyulept.com softdelete", a => a.IsDeleted == false)
//开启软删除过滤器,可定义多个全局过滤器
,
this.GetType().Assembly
//将本项目中所有继承实现的仓储批量注入
);

builder.Populate(services);
var container = builder.Build(www.xintiandiyule1.com);
return new AutofacServiceProvider(www.ysgj1688.com container);
}
然后在 controller 中就可以像平常一样使用仓储了,如:

[Route("restapi/[controller]www.meiwanyule.cn")]
public class SongsController www.suoLaieyuLe.com :www.yongshi123.cn Controller {

GuidRepository<Song>www.michenggw.com _songRepository;

public SongsController(GuidRepository<Song> repos1) {
_songRepository = repos1;

MTRRs实际上是一些MSR,通过这些MSR可以设置物理地址上某度固定的或者可变的范围的类型。具体的使用可以参考《64-ia-32-architectures-software-developer-system-programming-manual》手册中的说明。

MCA架构寄存器:x86平台提供了一个硬件检测和纠正的功能,称为Machine Check Architecture,相对应的也提供了一堆的寄存器用来查看相关的状态,可以参考x86架构——MCA 。这些寄存器其实也是MSR。

性能监控计数寄存器:x86平台CPU内部有一个PMU(Performance Monitoring Unit)用来监控性能,相对应的也提供了一堆的寄存器,它们也是MSR。

本文之后都以Vol1来指代的更多相关文章

  1. go语言爬虫 - TapTap用户都喜欢些什么游戏

    前面的废话 说到爬虫,首先想到的当然是python~ 它在机器学习.爬虫数据分析领域可谓是如日中天,十分热门.但我最近在学习go语言,所以就用go写了 TapTap社区 这是一个高品质的游戏分享社区, ...

  2. Java引用类型原理深度剖析,看完文章,90%的人都收藏了

    本文为synchronized系列第二篇.主要内容为分析偏向锁的实现. 偏向锁的诞生背景和基本原理在上文中已经讲过了. 本文将分为几块内容: 1.偏向锁的入口 2.偏向锁的获取流程 3.偏向锁的撤销流 ...

  3. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  4. MyBatis Generator 详解

    MyBatis Generator中文文档 MyBatis Generator中文文档地址:http://mbg.cndocs.tk/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中 ...

  5. MyBatis Generator 详解 【转来纯为备忘】

    版权声明:版权归博主所有,转载请带上本文链接!联系方式:abel533@gmail.com   目录(?)[+] MyBatis Generator中文文档 运行MyBatis Generator X ...

  6. Android内存溢出解决方案(OOM)

    众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视平台而定).因此在开发应用时需要特别关注自身的内存使用量,而一般最耗内存量的资源,一般是图片.音频文 ...

  7. Android处理图片OOM的若干方法小结 (推荐)

    众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视平台而定).因此在开发应用时需要特别关注自身的内存使用量,而一般最耗内存量的资源,一般是图片.音频文 ...

  8. 转载:mybatis自动生成

    MyBatis Generator中文文档 MyBatis Generator中文文档地址: http://generator.sturgeon.mopaas.com/ 该中文文档由于尽可能和原文内容 ...

  9. 第三篇:数据仓库系统的实现与使用(含OLAP重点讲解)

    前言 上一篇重点讲解了数据仓库建模,它是数据仓库开发中最核心的部分.然而完整的数据仓库系统还会涉及其他一些组件的开发,其中最主要的是ETL工程,在线分析处理工具(OLAP)和商务智能(BI)应用等. ...

随机推荐

  1. Day2 Numerical simulation of optical wave propagation之标量衍射理论基本原理(二)

    2.麦克斯韦方程组的简单行波解 讨论通过线性.各向同性.均匀.无色散.无限电荷和电流的电介质材料的光波传输.在这种情况下,介质具有如下属性: (1)推导获得波动方程( 由麦克斯韦方程组导出的.描述电磁 ...

  2. rest-framework的权限组件

    权限组件 写在开头: 首先要在models表中添加一个用户类型的字段: class User(models.Model): name=models.CharField(max_length=32) p ...

  3. Windows系统,文件和文件夹命名规则:

    不能包含:< > / \ | : * ? windows中,文件名(包括扩展名)可高达 个字符.文件名可以包含除 ? “ ”/ \ < > * | : 之外的大多数字符:保留文 ...

  4. CentOS搭建OpenVPN以及WIN&Android&iOS的安装连接

    OpenVPNhttp://info.swufe.edu.cn/vpn/openvpn/#2 苹果.安卓智能手机openvpn的设置_百度经验https://jingyan.baidu.com/art ...

  5. this is incompatible with sql_mode=only_full_group_by

    mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by - Jim_.NET - 博客园 http://www.c ...

  6. js-canvas(基本用法)

    ###1. canvas(画布) <canvas>是HTML 5 新增的元素,可用于通过使用JavaScript中的脚本来绘制图形 默认宽高为300px*150px 基本概念和方法入门推荐 ...

  7. Windows 下面 redis 发布为服务的官方方法

    除了 NSSM 之外 另外一种方式 感觉还是很好用的 redis-server --service-install redis.windows.conf --loglevel verbose 感觉也可 ...

  8. Chrome 浏览器的简单设置 无痕模式 暗黑模式 自定义用户目录

    1. Chrome73 新增加了暗黑模式 可以通过修改快捷方式的方式来默认开启方法如下 1.1 关闭浏览器 2.2 鼠标焦点定位到任务栏 Chrome 图标处, 并且按住shift 按键 执行右键操作 ...

  9. 解决.Net Mvc跨域请求问题

    针对ASP.NET MVC和ASP.NET Web API两种项目类型 1.针对ASP.NET MVC,只需要在web.config中添加如下的内容即可 <system.webServer> ...

  10. 关于controller的书写

    private Logger log = LoggerFactory.getLogger(ReportFormController.class); // 读取配置文件 ResourceBundle r ...