本文参考文档是《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. python获取当前日期时间

    转载自:https://www.cnblogs.com/wenBlog/p/6023742.html 在Python里如何获取当前的日期和时间呢?在Python语言里,我们可以通过调用什么模块或者类函 ...

  2. 写了一个Windows API Viewer,提供VBA语句的导出功能。提供两万多个API的MSDN链接内容的本地查询

    始出处:http://www.cnblogs.com/Charltsing/p/APIViewer.html QQ:564955427,QQ群:550672198 世面上的API Viewer已经不少 ...

  3. redis的spring的xml配置

    <!-- 集群版配置 --> <bean id="jedisCluster" class="redis.clients.jedis.JedisClust ...

  4. LZO

    LZO 是致力于解压速度的一种数据压缩算法,LZO 是 Lempel-Ziv-Oberhumer 的缩写.这个算法是无损算法,参考实现程序是线程安全的. 实现它的一个自由软件工具是lzop.最初的库是 ...

  5. 后台管理系统之系统操作日志开发(Java实现)

    一,功能点 实现管理员操作数据的记录.效果如下 二,代码实现 基于注解的Aop日志记录 1.Log实体类 package com.ideal.manage.guest.bean.log; import ...

  6. Docker存储驱动Device Mapper,Overlay,AUFS

    Docker存储驱动之Device Mapper简介 - BookShu - 博客园https://www.cnblogs.com/styshoo/p/6528762.html Docker存储驱动之 ...

  7. Alibaba Cloud Toolkit for Eclipse & ECS、EDAS 或容器服务 Kubernetes

    UserGuide_V2.1.0http://toolkit.aliyun.com/eclipse/?spm=5176.2020520130.105.3.3c3b697bOHma9f&msct ...

  8. IdentityServer4【Topic】之定义资源

    Defining Resources 定义资源 你在系统中通常定义的第一件事是你想要保护的资源.这可能是你的用户的身份信息,比如个人资料数据或电子邮件地址,或者访问api. 你可以通过C#对象模型(内 ...

  9. [转帖]SQL Server 索引中include的魅力(具有包含性列的索引)

    SQL Server 索引中include的魅力(具有包含性列的索引) http://www.cnblogs.com/gaizai/archive/2010/01/11/1644358.html 上个 ...

  10. logback框架之——日志分割所带来的潜在问题

    源码: logback-test.xml文件如下,有2个需要我们重点关注的参数: fileNamePattern:这里的日志文件名变动的部分是年月日时,外加1个文件分割自增变量,警告,年月日时的数值依 ...