- 博客(348)
- 资源 (30)
- 收藏
- 关注
原创 RISC-V特权架构 - 中断与异常概述
中断(Interrupt)机制,即处理器核在顺序执行程序指令流的过程中,突然被别的请求打断而中止执行当前的程序,转而去处理别的事情,待其处理完了别的事情,然后重新回到之前程序中断的点,继续执行之前的程序指令流,其要点如下。打断处理器执行程序指令流的“别的请求”便称之为中断请求(Interrupt Request),“别的请求”的来源便称之为中断源中断源通常来自于外围硬件设备。处理器转而去处理的“别的事情”便称之为中断服务程序中断处理是一种正常的机制,而非一种错误情形。
2024-03-01 10:55:08
2015
原创 RISC-V特权架构 - CSR寄存器
我们知道,CSR寄存器被划分为4个级别:用户级、监管级、超级监管级、机器级。接下来,我们看看各个权级,具体定义了哪些寄存器。
2024-02-29 11:31:50
6026
1
原创 RISC-V特权架构 - 特权模式与指令
例如,当多个处理器或线程同时访问和修改共享内存时,如果没有适当的同步机制,就可能出现一个处理器读取到的内存值是另一个处理器尚未写入的旧值的情况,从而导致程序行为的不正确。它会从特定的CSR寄存器(如sstatus、sepc等)中恢复监督模式的状态信息,并将sepc寄存器中的值复制到程序计数器(PC),从而确保处理器从正确的地址开始执行用户模式的程序。需要注意的是,sret指令只能在监督模式下执行,并且只有在软件修改了相应CSR寄存器的字段以指定要返回到的模式之后,才能安全地使用该指令进行返回操作。
2024-02-27 17:53:01
4890
原创 RV64 - 64位地址指令
那么RV32G 指令的64 位版本 – RV64G 指令,其示意图,如下(图9.1 至9.4)所示:灰色部分是将操作扩展到64 位寄存器的旧RV32指令,而深(红)色部分是RV64的新指令。由图可见,将RISC-V 扩展为64 位只需加入少数指令:32 位指令的字(word)、双字(doubleword)和长字(long)版本,并将包括PC 的所有寄存器扩展为64 位。因此,RV64I 中sub指令的操作数是两个64 位数,而非RV32I 中的32 位数。
2024-02-26 21:04:34
1245
原创 RISC-V指令集之RV32C
RV32C基于32位寄存器的RISC-V架构,同时增加了压缩指令集(C),可以将32位指令压缩为16位或更短的指令,从而减少指令存储和传输的开销,提高指令的缓存效率,同时降低功耗和成本。尽管处理器设计者不能忽略RV32C 指令,但能通过以下技巧降低实现开销:在执行指令前通过一个译码器将所有16 位指令翻译成相应的32 位指令。此外,16 位指令仅对汇编器和链接器可见,并由它们决定是否将标准指令替换为相应的短指令。本文中的这些指令较多,具体指令详细含义,见RISC-V指令手册,不再赘述。
2024-02-26 17:57:14
841
原创 RISC-V指令集之RV32A
预订取数读出一个内存字,写入目的寄存器,并记录该内存字的预订信息。RV32A 是可选的,一个不支持它的RISC-V 处理器会更简单。AMO 指令对内存中的操作数执行一次原子操作,并将原内存值写入目的寄存器。简洁编程语言开发者假定底层的体系结构提供原子的比较-交换操作:比较某寄存器值与用另一寄存器寻址的内存值,若相等,则将第3。个寄存器的值与内存值交换。本文中的这些指令较多,具体指令详细含义,见RISC-V指令手册,不再赘述。RV32A是RISC-V规范定义的用于原子操作的指令集。
2024-02-26 17:18:45
595
原创 RISC-V指令集之RV32I
RV32I数据读写指令,可以从内存中加载数据到寄存器,或者将寄存器值存储到内存。在RISC-V 的规范里面,RV32I定义了32 个通用寄存器,其中31个是常规寄存器,1个恒为0值的x0寄存器。RV32I指令集,一共包含了47条指令,分别涵盖了数据传输、算术运算、逻辑运算、分支跳转、比较判断等功能。通过上述内容的学习,我们了解了RV32I指令集有哪些指令,以及这些指令的字节码(机器码)构成。这里展示了RV32I指令集的每一条指令,并且每条指令的具体格式,以及指令类型。RV32I具备的所有指令,如下所示。
2024-02-01 21:08:13
2549
原创 RISC-V指令格式
在RISC-V指令集架构中,G表示通用组合,全称为RV32G(32位)或RV64G(64位)。也就是说,RISC-V的所有指令集合名称,全部是以RV打头,加位宽,加模块名来组成的,后续识别也就很简单了。因此,RV32I,表示RISC-V的32位整数指令集,它是RISC-V 的核心,是冻结的,永远不会改变。I表示基础整数指令集;因此,G是RISC-V指令集架构中通用处理器所包含的指令集的表示。RV32G,表示32位RISC-V通用处理器,指令集组合。我们看看RISC-V的命名规范,是如何定义的,就明白了。
2024-01-31 18:19:47
3302
原创 RISC-V指令集简介
RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。与大多数指令集相比,RISC-V指令集可以自由地用于任何目的,允许任何人设计、制造和销售RISC-V芯片和软件。虽然这不是第一个开源指令集,但它具有重要意义,因为其设计使其适用于现代计算设备(如仓库规模云计算机、高端移动电话和微小嵌入式系统)。设计者考虑到了这些用途中的性能与功率效率。RISC-V包含一个非常小的基础指令集和一系列可选的扩展指令集。
2024-01-30 15:59:39
2122
原创 RISC-V指令集基础系列教程
RISC-V(发音为“RISC five”)的目标,是成为一款通用的指令集架构(Instruction Set Architecture,ISA)。RISC-V 是一款与众不同的ISA,不仅因为它年轻(它诞生于2010 年,而其他ISA 大多诞生于1970 或1980 年代),而且因为它开放。与过去几乎所有架构不同,其未来不受任何一家公司的兴衰或心血来潮的决策所影响(过去许多ISA 因此消亡)。相反,RISC-V 属于一个开放的、非营利性质的基金会。
2024-01-30 11:35:50
1500
原创 管理命令集之一
管理命令集(Admin Command Set),定义了可以提交到Admin Submission Queue的命令,这些命令以操作码(Opcode)的形式,进行编码,如下表所示:O/M定义:O = 可选,M = 强制未列出的操作码被保留在命令的“Dword 0”中Opcode00 ~ 11h,命令主要负责I/O Queue与Firmware等管理工作。80 ~ BFh,特定于I/O命令集。C0 ~ FFh,特定于供应商的。
2024-01-25 20:21:12
1246
1
原创 NVMe系统内存结构 - 命令聚合与仲裁
Fused Operations(聚合操作),是指通过“融合”两个更简单的命令,来实现更复杂的命令。这个功能是可选的,Identify Controller Data Structure表明了对该特性的支持。在聚合操作中,有以下要求:这两个命令,应作为一个原子单元按顺序执行;控制器应表现为,在这两个命令之间,没有执行过其他操作。在这两个命令中遇到错误时,操作结束。如果序列中的第一个命令失败,那么第二个命令将被中止。如果序列中的第二个命令失败,那么第一个命令的完成状态是序列特定的。LBA ra
2024-01-19 12:04:42
1194
原创 NVMe系统内存结构 - 完成消息格式
命令需要被提交到Submission Queue中,以便NVMe控制器执行,在执行结束后,会有对应的完成状态,放入到Completion Queue中。NVMe命令长度均为64Byte,对应的Completion消息长度均为16Byte。
2024-01-18 10:16:57
1412
原创 NVMe系统内存结构 - Meta Data
端到端:一端是主机的内存空间,一端是SSD的闪存空间。我们需要保护的是用户数据。主机与SSD之间,数据传输的最小单元是逻辑块(Logical Block,LB),每个逻辑块大小可以是512/1024/2048/4096等字节,主机在格式化SSD的时候,逻辑块大小就确定了,之后两者就按这个逻辑块大小进行数据交互。数据从主机到NVM(Non-Volatile Memory,目前一般是闪存,后面我就用闪存来代表NVM),首先要经过PCIe传输到SSD的控制器,然后控制器把数据写入闪存;反过来,主机想从闪
2024-01-16 21:09:30
1540
原创 NVMe系统内存结构 - SGL
Scatter Gather List(SGL)是一个数据结构,用以描述一段数据空间,这个空间可以是数据源所在的空间,也可以是数据目标空间。SGL首先是个List,是个链表,由一个或者多个SGL Segment组成,而每个SGL Segment又由一个或者多个SGL Descriptor组成。
2024-01-16 15:51:48
1992
原创 NVMe系统内存结构 - PRP与PRP List
NVMe把Host的内存划分为一个一个页(Page),页的大小可以是4KB,8KB,16KB… 128MB。物理内存页面大小,由主机软件在“CC.MPS”中配置。Physical Region Page (PRP),PRP是指向物理内存页(Page)的指针。下图,显示了由Page Base Address和Offset组成的PRP的布局。
2024-01-12 15:29:57
3572
2
原创 NVMe系统内存结构 - 命令格式
Head和Tail条目指针,对应于Completion Queue Head Doorbells和Submission Queue Tail Doorbells。doorbell寄存器由host软件更新。Tail一个Queue条目的提交者,使用当前Tail条目指针,来标识下一个空闲Queue条目空间。提交者将新条目,提交到Tail指向的空闲Queue条目空间后,对Tail条目指针加1。如果Tail条目指针增量,超过Queue大小,则Tail条目指针将归零。
2024-01-08 17:44:07
2055
原创 NVMe控制器寄存器
NVMe控制器寄存器,位于配置空间BAR0与BAR1,所映射的内存空间中。BAR0为低32位,BAR1为高32位,一起组合为64位内存地址,表示PCIe设备内存空间的基址。NVMe控制器寄存器,就位于该内存空间中,并且host访问这些寄存器,应按原始宽度或32位对齐来访问。由于NVMe控制器寄存器,位于PCIe设备内存空间中,因此上表中Start和End列,是相对于PCIe设备内存空间基址的偏移。
2024-01-03 15:29:23
2246
原创 NVMe配置空间寄存器
NVMe基于PCIe协议,因此也必须满足PCIe协议的基本要求。本节主要介绍,NVMe设备的配置空间组成,比如PCI Header、PCI Capabilities和PCI Express Extended Capabilities,并且还有NVMe设备的附加要求。NVMe设备,如下所示:可以看到有,1个PCI Header,4个Capability,1个Extended Capability,接下来,我们详细介绍。
2023-12-26 15:39:08
1935
原创 NVMe的Queue与命名空间
NVM Express (NVMe)是一个寄存器级接口,用来实现主机软件与非易失性存储器子系统通信。该接口针对企业和客户端固态驱动器进行了优化,通常附加到PCI Express接口。该接口的目标是在客户端和企业系统中使用。此外,该规范还定义了一个用于NVM子系统的标准命令集。
2023-12-22 17:50:43
1949
1
原创 NVMe前世今生
目前机械硬盘大多数使用 SATA (Serial ATA Advanced Host Controller Interface) 接口,接口协议为 AHCI,是 Intel 联合多家公司研发的系统接口标准。AHCI 最大队列深度为 32,即主机最多可以发 32 条命令给 HDD 或 SSD 执行,在 HDD 时代整个性能瓶颈在硬盘端,而不是接口和协议端,所以 AHCI 可以很好的匹配 HDD。
2023-12-19 16:08:40
2128
原创 NVMe协议基础系列教程
NVMe是一种基于PCIe的应用层协议,NVMe应用非常广泛,可用于计算机硬盘、固态硬盘、存储服务器、虚拟存储系统等。它可以大大提高存储设备的性能,有助于提升系统的性能。我们以NVMe 1.1a版本协议为例,分如下章节进行介绍。4 《NVMe控制器寄存器》10 《错误报告与恢复》5 《系统内存结构》7 《NVM命令集》
2023-12-19 11:48:01
1658
原创 X64(64位)汇编指令与机器码转换原理
REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。REX.W说明需要REX前缀,REX格式为0100WRXB,W表示操作数宽度,W=1表示64位,X位默认为0,因此REX=01001001=49h。第二步,以寄存器操作数,反推ModRM.reg与REX.R。
2023-11-01 18:11:12
5399
1
原创 X86(32位)汇编指令与机器码转换原理
本文属于《》之一,欢迎查看其它文章。在X86 32位架构下,指令格式定义中,新增了SIB字节。SIB(Scale, Index, Base)字节的意义是用于指定一种复杂的寻址方式(按比例变址寻址),在中已经介绍过了。
2023-10-27 18:15:48
1805
原创 VS搭建32位和64位汇编开发环境
在菜单中,“调试”->“窗口”->“内存”/“反汇编”/“寄存器”菜单项,可以在调试时,打开对应的窗口。
2023-10-26 21:12:00
3749
1
原创 8086(16位)汇编指令与机器码转换原理
在上一节,我们讲了X86指令基本格式。在8086架构下,是不存在SIB字节的,因此,我们重点关注ModR/M。
2023-10-26 11:18:56
4431
1
原创 CPU寄存器与寻址方式
在SIB寻址中,地址计算分为三个部分:基址、索引和比例因子。- 基址(base),包含一个或多个寄存器,用于指定基址。在指令中,可以使用一个或多个寄存器来作为基址。这些寄存器可以是通用寄存器(如RAX、RBX等)或系统寄存器(如CR3等)。- 索引(index),包含一个或多个寄存器,用于指定在基址上的偏移量。在指令中,可以使用一个或多个寄存器来作为索引。这些寄存器可以是通用寄存器(如RCX、RDX等)或系统寄存器(如RSI、RDI等)。- 比例因子(scale),是一个常数,用于指定比例因子。
2023-10-23 20:06:11
2091
原创 将数据、代码、栈放入不同的段
我们在源程序中为这3个段起了具有含义的名称,用来放数据的段我们将其命名为“data” ,用来放代码的段我们将其命名为"code” ,用作栈空间的段命名为“stack”。总之,CPU 到底如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对CS:IP、SS:SP、DS等寄存器的设置来决定的。定义多个段的方法这点,我们从程序中可明显地看出,定义一个段的方法和前面所讲的定义代码段的方法没有区别,只是对于不同的段,要有不同的段名。
2023-10-19 14:03:17
250
原创 [BX]和Loop指令
我们定义的描述性的符号: "()”,为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号 **“()”来表示一个寄存器或一个内存单元中的内容**。比如:(ax)表示ax中的内容、(al)表示al中的内容
2023-10-18 16:39:53
277
原创 内存访问与栈
在x86程序执行时,内存会被分段,每个段(segment)都有其特定的用途。以下是常见的几个段: - **代码段(Code Segment)**:代码段,也被称为文本段,是存储程序代码的地方。这通常包括二进制指令,也就是CPU执行的机器代码。 - **数据段(Data Segment)**:数据段是用于存储程序中定义的数据的位置,包括变量、数组等。这些数据在编译时被确定并存储在可执行文件或DLL中。当程序运行时,这些数据被加载到内存中,并分配给对应的内存地址。 - **堆(Heap)**:堆是动态分
2023-10-16 17:31:07
292
原创 DOSBox和MASM搭建16位8086汇编开发环境
link会将obj文件的一个个段拿出来,按照程序员规定的组合方式进行段组合,确定是否要合并或则颠倒一些顺序,然后生成exe文件。在D:/masm32目录下,有一个汇编文件hw.asm,该段代码,主要实现打印一行“hello world!这时候你就会发现,D:/masm32文件夹下,多了两个新文件:hw.obj和hw.exe。选择工作目录,路径中不要有中文,路径越简单越好,我们这里选择D盘。C:,表示进入C盘,也就是进入D:/masm32目录。因此,将masm32文件夹拷贝到D:/目录下。
2023-10-12 14:40:38
2571
原创 8086CPU指令执行的基本过程
我们说8086CPU的上一代CPU(8080、8085)等是8位机,而8086是16位机,也可以说8086 是16位结构的CPU。8086CPU 的所有寄存器都是 16 位的,可以存放两个字节。AX、BX、CX、DX 这 4个寄存器通常用来存放一般性的数据,被称为通用寄存器。
2023-10-11 11:21:44
2171
原创 X86指令基本格式
机器码是CPU可以识别,并执行的二进制数据。通常使用高级语言,如C/C++编写的代码,经过编译之后,生成的可执行文件中,就包含了机器码,可以被CPU执行。如果你熟悉X86机器码,具体的定义,那么你可以在文件中,徒手直接编写机器码,这样也可以被CPU执行,只不过难度很大,没有我们使用高级语言编写,然后编译为机器码,来的简单。机器码,是我们通俗的叫法。在X86架构下,机器码就是指一条一条的X86指令,这些指令的集合,就叫做X86指令集。
2023-10-08 16:59:23
2988
原创 MSR寄存器访问
MSR是CPU的一组64位寄存器,每个MSR都有它的地址值(如下图所示),可以分别通过RDMSR 和WRMSR 两条指令进行读和写的操作。如图中为8个P-state寄存器,地址分别为0xC001 0064 ~ 0xC001 006B,每个寄存器64bit。
2023-02-18 17:25:30
3045
1
原创 美联储历次加息周期及结果
若 A 股市场的经济平稳运行,那么对 A 股嗯,市场的影响不会太强烈,毕竟外围市场的起伏波动,只会造成一时的影响,长期来看的话,中国也会采取相应的措施,去应对美国加息带来的各种不良影响。美联储加息后,就意味着会有大量资金流向了美国的市场,使得美元大幅升值,那么流入股市的资金就会大大的减少,对股市形成一定的冲击。当时,当时通胀抬头。2022年3月,美国开始加息,表面上的原因是“治理国内通胀”,实际上更深层的意图,是在“全球经济危机”中,加大美元的国际竞争能力,意图吸引欧洲以及全球的避险资金,流入到美国。
2022-12-30 12:00:18
11125
NEMU模拟器源码(DiffTest)
2024-07-15
DOSBox-MASM.rar
2023-10-12
AMD处理器编程指导手册
2023-02-18
CodeEditor源码文件
2022-12-07
CXL2.0协议规范文档-中文版
2022-10-27
CXL1.1协议规范文档-中文版
2022-10-27
SourceInsight4.0仿VS2013代码风格主题
2022-02-16
2020最新个税计算器打包脚本
2020-10-19
2020最新个税计算器免安装版
2020-10-19
2020最新个税计算器安装包
2020-10-19
cachesize-master.zip
2020-09-23
processhacker-2.39-sdk.zip
2020-09-23
Flops-master.zip
2020-09-13
processhacker-2.39-src.rar
2020-09-13
processhacker-2.39-bin.rar
2020-09-13
AMD_block_prefetch_paper.pdf
2020-09-13
qt-vsaddin-msvc2017-2.4.3-rev.07.vsix
2020-09-13
boost_reflect-master.rar
2020-09-13
Win64OpenSSL-1_0_2u.rar
2020-09-13
rttr-0.9.5-win64-vs2015.7z
2020-09-13
ResourceHacker.rar
2020-09-13
FastMemcpy-master.zip
2020-09-13
openssl-1.0.1a.tar.gz
2020-09-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅