Browse Source

Merge branch 'sunym1993:main' into main

pull/22/head
xiaotianZhang456 3 years ago
committed by GitHub
parent
commit
224220de54
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 17
      FAQ/第一回FAQ.md
  2. 1
      Intel 手册中文版/README.md
  3. 124
      Intel 手册中文版/卷一:基本架构.md
  4. 1
      README.md

17
FAQ/第一回FAQ.md

@ -18,4 +18,19 @@
![image](https://user-images.githubusercontent.com/25787738/141405471-44a45263-df37-418a-bc47-3bf1f3729f64.png)
### CPU 刚启动时为什么能直接访问 BIOS 的代码?
@解答人:ShengHui
可以分两部分来解释:1.CPU的硬件通路可以直接访问BIOS的地址。2.CPU复位后的硬件地址在BIOS所在的地址。
首先解释1。在设计CPU时会把CPU可以访问的地址进行划分,包括片内的ram,寄存器等,和片外的ROM,DDR,其他外设等。当CPU访问这些被提前划分好的地址时,会有不同的手段。比如对于 `UINT32 a=*(volatile UINT32)0x1000;` 来说,如果`0x1000`地址被分配至片内ram,则CPU会通过片内总线读取这段地址,如果被分配至片外,则会通过相应的总线进行访问。BIOS通常指代存在BIOS芯片中的程序,而BIOS芯片实际上就是一个ROM存储器,大部分是FLASH,BIOS程序由厂商固化至其中。CPU的硬件通路可直接通过外设总线(通常是SPI)访问其中内容。
再来解释2。CPU在上电复位后一定是从一个确定的地址启动,该地址(在PC机的结构下)被分配至BIOS所在的地址,并由内部硬件逻辑控制。其他类型的CPU可能会被分配至其他片内/片外存储器上,如51在0地址启动,MIPS大多在`0xBF400000`,不同的CPU复位启动地址可能会不同。 如果想了解更多可继续向下看,本人也不专业,仅做原理说明。
咨询了一下大佬,硬件复位逻辑EDA的实现大致如下:
```
always@(negedge rstn or posedeg clk)
if(~rst)
begin
reg<=0;
end
else
begin
reg<=wire;
end
```
简单解释下就是,当芯片复位(假设高有效)之前,寄存器会被赋一个初值,且如果RST没有被放开则所有的逻辑都会被强制拉住,不会有任何动作。RST有效之后,硬件逻辑才会开始工作,对于CPU来讲就从指令地址寄存器(已被初始化)中取到第一个指令的地址,如果从这个地址拿到了有效指令,那么就开始一条一条的跑下去了。因而可以看到,硬件复位地址完全由设计人员决定,不必太过于纠结为何如此,仅需参考芯片手册即可。

1
Intel 手册中文版/README.md

@ -11,6 +11,7 @@
- 中文和英文两端要有空格
- 图片无需上传,只需标注图片标号,如 Figure 2-5
- 语句要通顺,自己多读几遍,不会合并翻译有明显问题的 pr
- 提 pr 前看下 md 编辑后的预览,很多人的 md 格式都是有错误的,看一眼预览一下就知道了,避免浪费时间打回
### 具体手册链接

124
Intel 手册中文版/卷一:基本架构.md

@ -203,6 +203,7 @@ Intel 和 IA-32 处理器都是采用“little endian(小端)”方式存储
\#GP(0)
# 第二章 Intel 64 and IA-32 Architectures
## 2.1 INTEL® 64 与 IA-32 架构的简要历史
以下章节提供了从 IA-32 到 Intel 64 架构的主要技术演进的摘要:从 Intel 8086 处理器开始到最新的 Intel®Core®2Duo,Core 2 Quad 和 Intel Xeon 处理器 5300 和 7300 系列。1978 年以前发布的处理器创建的对象代码仍然在 Inter 64 和 IA-32 架构系列中的最新处理器上运行着。
@ -213,13 +214,89 @@ Intel 和 IA-32 处理器都是采用“little endian(小端)”方式存储
8086/8088 向 IA-32 架构引入了段(segmentation)。通过分段, 16 位段寄存器可以指向高达 64 KB 的内存段。同时使用四个段寄存器,8086/8088 处理器能够不在段之间切换的情况下寻址达 256 KB。使用段寄存器和额外的 16 位指针可以形成的 20 位地址提供 1 MB 的总寻址范围。
### 2.1.2 Intel® 286 处理器(1982)
Intel 286 处理器向 IA-32 架构中引入了保护模式。保护模式使用段寄存器的内容作为选择器(selector)或指针指向描述符表(descriptor table)。描述符(Descriptor)提供 24 位基址,物理内存可达 16 MB,支持基于段交换的虚拟内存管理,以及一些保护机制。这些机制包括:
* 段限制检查
* 只读和只执行段选项
* 四种特权级
### 2.1.3 Intel 386 处理器(1985)
Intel 386 处理器是 IA-32 体系结构家族中的第一个 32 位处理器。它引入了 32 位寄存器用于保存操作数和寻址。每个 32 位 Intel 386 寄存器的低地址保留了早期 16 位寄存器的内容,允许向后兼容。 386 处理器还提供虚拟化 8086 模式,使得在执行 8086/8088 处理器创建的程序时效率更高。
此外,Intel 386 处理器支持以下功能:
* 32 位地址总线,支持多达 4 GB 物理内存
* 段内存模型和一个平面(flat)内存模型
* 分页,使用固定的 4 KB 页面大小为虚拟内存管理提供了一种方法
* 支持并行级
### 2.1.4 Intel 486 处理器(1989)
Intel 486 处理器通过将 Intel 386 处理器的指令解码(decode)和执行(execution)扩展到五个流水线步骤,增加了并行执行能力。在不同的执行阶段,每个阶段与其他阶段并行操作,最多可并行执行 5 条指令。
此外,处理器还增加了:
* 一个 8 KB 芯片一级缓存,增加了在每个时钟上执行指令的数量
* 集成 x87 FPU
* 节能和系统管理能力
### 2.1.5 The Intel® Pentium® 处理器 (1993)
Intel Pentium processor 的引入增加了第二个执行管道(execution pipeline),以实现超量性能(两个管道,称为 u 和 v,一起可以在每个时钟上执行两条指令)。芯片上的一级缓存增加了一倍,其中 8 KB 用于代码,另外 8 KB 用于数据。除了 Intel 486 处理器使用的透写缓存(write-through cache)外,数据缓存使用 MESI 协议来支持更有效的回写缓存(write-back cache)。为了提高循环结构的性能,增加了带有芯片上分支表的分支预测。
此外,处理器还增加了:
* 扩展使虚拟 8086 模式更高效,并允许 4MB 和 4KB 页面大小
* 128 和 256 位的内部数据路径提速到内部数据传输
* 突破性的外部数据总线增加到 64 位
* 支持多处理器系统的 APIC
* 双处理器模式,支持无胶(glueless)双处理器系统
奔腾系列后续引入了 Intel MMX 技术(带 MMX 技术的奔腾处理器)。INTEL MMX 技术使用单指令,多数据(SIMD)执行模型来并行执行 64 位寄存器中的包装(packed)整数数据。
参见 2.2.7 节, “SIMD 指令”。(Todo link)
### 2.1.6 - 2.1.22
[@翻译人:zhangkai803](https://github.com/zhangkai803)
# 第三章 Basic Execution Environment
## 3.1 操作模式
## 3.4 BASIC PROGRAM EXECUTION REGISTERS
IA-32 架构支持三种基本的运行模式:保护模式、实地址模式和系统管理模式。操作模式决定了哪些指令和架构特性是可用的。
* **保护模式**(Protected mode)--该模式是处理器的本机状态(native state)。保护模式是指能够在受保护的多任务环境中直接执行实地址模式 8086 软件。这个特性被称为**虚拟-8086 模式**,尽管它实际上不是处理器模式。虚拟-8086 模式实际上是保护模式的一个属性,可以被任何任务开启。
* **实地址模式**(Real-address mode)-- 该模式实现了 Intel 8086 处理器的编程环境,具有扩展功能(例如切换到保护模式或系统管理模式的能力)。处理器在通电或复位后被置于实地址模式。
* **系统管理模式** (System management mode,SMM)--该模式为操作系统或执行程序提供透明的机制,实现平台相关特有的功能,如电源管理、系统安全等。当外部 SMM 中断引脚(SMI#--SMM interrupt)被激活或从高级可编程中断控制器(APIC)接收到 SMI 时,处理器进入 SMM。
在 SMM 中,当保存当前运行的程序或任务的基本上下文时,处理器切换到一个单独的地址空间。然后可以透明地执行特定于 SMM 的代码。当从 SMM 返回时,处理器被放置回系统管理中断之前的状态。SMM 是在 Intel386 SL 和 Intel486 SL 处理器中引入的,并成为奔腾处理器家族的标准 IA-32 特性。
### 3.1.1 Intel® 64 架构
Intel 64 架构增加了 IA-32E 模式。IA-32E 模式有两个子模式。他们是:
* 兼容模式(IA-32E 模式的子模式) - 兼容模式允许大多数传统的 16 位和 32 位应用程序在无需重新编译情况下运行在 64 位操作系统。兼容性子模式在 IA-32 架构中简称为兼容模式。兼容模式的执行环境与 3.2 节描述相同。兼容模式还支持 64 位和保护模式支持的所有特权级。以虚拟 8086 模式或使用硬件任务管理的遗留应用程序不能在此模式下工作。
兼容模式是操作系统在代码段的基础上启用的。这意味着单个 64 位操作系统可以支持以 64 位的应用程序以 64 位模式运行,并支持以兼容模式运行的传统的 32 位应用程序(未重新编译为 64 位)。
兼容性模式类似于 32 位保护模式。应用程序只访问线性地址空间的前 4 G。兼容模式使用 16 位和 32 位地址和操作数大小。与保护模式一样,这种模式允许应用程序使用 PAE(Physical Address Extensions)访问大于 4 G 的物理内存。
* 64 位模式(IA 32e 模式的子模式)- 这种模式使 64 位操作系统能够运行访问 64 位地址空间的应用。64 位子模式在 IA-32 架构中简称为 64 位模式。
64 位模式将通用寄存器和 SIMD 扩展寄存器的数量从 8 升到了 16。并且通用寄存器扩展到 64 位。该模式还引入了一个新的操作码前缀(rex)以访问寄存器的扩展位。有关详细说明,请参见第 3.2.1 节。
操作系统以代码段为基础启用 64 位模式。其默认地址大小为 64 位,其默认操作数大小为 32 位。可以使用 REX 操作码前缀和操作数大小覆盖前缀在逐条指令的基础上覆盖默认操作数大小。
REX 前缀允许在 64 位模式下指定 64 位操作数。通过此机制,许多现有指令允许使用 64位寄存器和 64 位地址。
## 3.4 BASIC PROGRAM EXECUTION REGISTERS
### 3.4.2 段寄存器
@翻译人:墨
段寄存器控制(代码段寄存器,数据段寄存器,堆栈段寄存器,扩展段寄存器,标志段寄存器,全局段寄存器)16 位的段选择子。段选择子是一种特殊的指针,用来标识内存中的段。为了访问内存中特定的段,该段的段选择子必须存在于适当的段寄存器中。
@ -275,11 +352,56 @@ CS , DS , SS 和 ES 这四个段寄存器与 Intel 8086 and Intel 286 处理器
@翻译人:符宇舟Alex
## 4.4 BIT FIELD DATA TYPE
[@翻译人:Hola39e](https://github.com/Hola39e)
位域数据类型(见图4-6)是一个连续的比特序列。它可以从内存中任何字节的任何位开始,最多可以包含32位。
Figure 4-6 here
## 4.5 STRING DATA TYPES
[@翻译人:Hola39e](https://github.com/Hola39e)
字符串数据类型是比特、字节、字或双字的连续序列。一个比特串可以从任何字节的任何比特位置开始,并且可以包含最多$2^{32}-1$个比特。一个字节串可以包含字节、字或双字,并且长度范围可以包含从0到$2^{32}-1$个字节(4GB)。
## 4.6 PACKED SIMD DATA TYPES
[@翻译人:Hola39e](https://github.com/Hola39e)
Intel64和IA-32架构定义与操作一组64位和128位包装(Packed)数据类型,中文又称数据向量,用于单指令多数据流(SIMD)操作。这些打包数据类型的由基本的数据类型(打包对齐的字节、字、双字和四字组成),以及用于进行矢量运算(Packed)指令操作的整数,浮点数基本类型的数值说明。
### 4.6.1 64-Bit SIMD Packed Data Types
[@翻译人:Hola39e](https://github.com/Hola39e)
64位包装(Packed)SIMD数据结构是在Intel MXX指令集中加入到IA-32中去的。它们在MXX寄存器中被操作。基本的64位包装数据类型是打包对齐起来的字节、字以及双字(见图4-7)。当执行SIMD操作时,这些数据结构会被解释成
进行矢量运算(Packed)指令操作的字节、字、双字长度的整数值。
Figure 4-7 here
### 4.6.2 128-Bit Packed SIMD Data Types
[@翻译人:Hola39e](https://github.com/Hola39e)
128位包装(Packed)SIMD数据结构是在SSE扩展指令集中被引入到IA-32中去的,在SSE2,SSE3,SSSE3扩展指令集中被使用。它们主要在128位的XMM寄存器和内存中进行操作,基本的128位包装数据类型是打包对齐起来的字节、字、双字、四字组成的(见图4-8)。当对在XMM寄存器中保存的包装(Packed)数据类型执行SIMD操作时,这些数据类型会被解释进行矢量运算(Packed)指令操作或标量运算(Scalar)指令操作的单精度浮点数或双精度浮点数,或者进行矢量运算(Packed)的长度为字节、字、双字、四字的整数值。
Figure 4-8 here
# 第五章 Instruction Set Summary
# 第六章 Procedure Calls, Interrupts, and Exceptions
## 6.3 CALLING PROCEDURES USING CALL AND RET
### 6.3.1 Near CALL and RET Operation
@翻译人:si
### 6.3.2 Far CALL and RET Operation
@翻译人:si
## 6.4 INTERRUPTS AND EXCEPTIONS
### 6.4.1 Call and Return Operation for Interrupt or Exception Handling Procedures
@翻译人:si
# 第七章 Programming With General-Purpose Instructions
# 第八章 ~ 第十八章

1
README.md

@ -40,6 +40,7 @@
* [第一回 最开始的两行代码](https://mp.weixin.qq.com/s/LIsqRX51W7d_yw-HN-s2DA)
* [第二回 自己给自己挪个地儿](https://mp.weixin.qq.com/s/U-txDYt0YqLh5EeFOcB4NQ)
* [第三回 做好最最基础的准备工作](https://mp.weixin.qq.com/s/90QBJ-lP_-du2qQJxNF-Fw)
* [第四回 把自己在硬盘里的其他部分也放到内存来](https://mp.weixin.qq.com/s/hStc-y-sabP-KwJUDUesTw)
* **第二部分:大战前期的初始化工作**

Loading…
Cancel
Save