计算机体系结构重点学习

从外部I/O与上层应用交互的整体软硬件过程

上层应用发出I/O请求:上层应用程序,如一个文本编辑器、网络浏览器或者任何软件应用,需要读取或写入数据时,会通过调用操作系统提供的API(如文件操作API、网络操作API等)来发出I/O请求。
操作系统层面的处理:操作系统接收到应用程序的I/O请求后,会执行一系列的操作来管理这个请求。这包括确定需要交互的具体I/O设备调用对应的设备驱动程序,以及将请求从用户空间转移到内核空间
设备驱动程序:设备驱动程序是与具体硬件设备通信的软件接口。当操作系统确定了需要交互的设备,它会使用设备的驱动程序来具体操作设备。设备驱动程序了解如何控制特定的硬件设备,并执行如数据传输等操作。
I/O操作执行:驱动程序通过各种控制信号和数据传输协议与硬件设备通信,执行实际的读写操作。这可能涉及到中断请求(IRQ)、直接内存访问(DMA)等机制,以高效地完成数据的传输。
中断和轮询:I/O操作通常会通过中断或轮询的方式来告知操作系统其完成状态。中断方式下,设备在完成操作后会发送一个中断信号给CPU,CPU响应中断,执行中断处理程序;而轮询方式则是操作系统不断检查设备的状态,以确定操作是否完成。
将结果返回给应用:操作完成后,操作系统会处理如数据复制、状态更新等后续任务,然后通过之前的API调用,将结果返回给发起请求的应用程序。
应用程序处理结果:应用程序收到操作系统返回的数据或操作结果后,根据需要进行后续处理。这可能包括更新用户界面、处理数据或生成输出等。
这个过程显示了从上层应用到底层硬件的一系列交互动作,涉及软件(应用程序、操作系统、驱动程序)和硬件(I/O设备)的紧密合作,确保信息能够正确、高效地在系统各部分间流动。

基于LoongArch处理器的Linux操作系统TLB例外过程

TLB例外:TLB(Translation Lookaside Buffer)例外是指处理器在执行程序时,试图访问的虚拟内存地址没有在TLB中找到相应的物理地址映射条目时发生的一种特殊情况。TLB作为一种快速映射虚拟地址到物理地址的缓存,其目的是加速虚拟到物理地址的转换过程。当程序试图访问的地址未在TLB中找到时,即触发TLB例外,此时需要操作系统介入,通过查询页表(Page Table)来处理这个例外,找到或者分配适当的物理地址并更新TLB,以便程序可以继续执行。
TLB重填异常:TLB重填异常是TLB例外的一种具体处理过程,它发生在TLB未命中的情况下。在LoongArch处理器或MIPS处理器等采用软件TLB重填机制的体系结构中,当发生TLB未命中例如由于操作系统只分配了虚拟地址范围而未实际分配物理内存空间时,就会引起TLB重填异常。此时,操作系统的TLB重填异常处理程序会被激活,负责从对应的页表中取得页表项内容填入TLB。如果在处理过程中发现相关的物理页面尚未分配,则会先进行物理页面的分配和页表项的初始化,然后再进行TLB的更新。这确保了后续对该虚拟地址的访问能直接在TLB中命中,不会再次触发异常。
总之,TLB例外和TLB重填异常是虚拟内存管理中处理虚拟地址转换未命中的机制,是操作系统与处理器共同协作处理虚拟内存访问的重要手段。
TLB重填异常是TLB例外中的一种,关系是包含和被包含的关系。TLB重填异常特指因TLB查找未命中而导致的需要重填TLB表项的情况,而TLB例外则是更广义的概念,包括TLB重填异常在内的所有与TLB相关的异常情况。
基于LoongArch处理器的Linux操作系统处理TLB(Translation Lookaside Buffer)例外的过程包括以下几个关键步骤
TLB重填异常的触发:当处理器执行指令需要访问内存时,会首先在TLB中查找虚拟地址到物理地址的映射。如果这个映射不存在于TLB中,就会触发一个TLB重填异常。
异常处理程序的执行:一旦TLB重填异常被触发,处理器会开始执行操作系统中的TLB重填异常处理程序。TLB重填异常处理程序需要执行9条指令,每增加一个级别的页表,只需增加一条LDDIR指令。在这个过程中,异常处理程序会根据需要访问的虚拟地址去检查页表,查找虚拟地址对应的物理地址。

异常处理程序具体操作步骤

异常触发当处理TLB查找不命中时,操作触发TLB重填异常。
记录虚地址信息异常处理程序根据CSR.TLBRBADV中VAddr域记录的虚地址信息。
遍历多级页表程序利用CSR.PGD中得到的页目录表PGD的基址信息,遍历发生TLB重填异常的进程的多级页表。
页表项信息读取从内存中取回页表项信息填入CSR.TLBRELO0和CSR.TLBRELO1的相应域中。
使用TLBFILL指令填入TLB最终用TLBFILL指令将页表项填入TLB。这个过程中,写入TLB的信息来自CSR.TLBRELO0和CSR.TLBRELO1的各个域,以及CSR.ASID中ASID域和CSR.TLBREHI中VPPN域的信息。
上述步骤保证ASID域不变在TLB重填异常处理过程中,软硬件都没有修改CSR.ASID中的ASID域,所以在执行TLBFILL指令时,CSR.ASID中的ASID域记录的就是发生TLB重填异常的进程对应的ASID。
设置TLBREHI中的VPPN域至于CSR.TLBREHI中的VPPN域,在TLB重填异常发生并进入异常入口时,已经被硬件填入了触发该异常的虚地址中的虚双页号信息。

页表遍历和物理地址获取:异常处理程序会遍历页表,寻找虚拟地址对应的页表项。如果页表项在内存中存在,处理程序会从中取得页表项,包括物理页的地址以及相关权限等信息。
更新TLB:一旦物理地址被获取,TLB重填异常处理程序会把虚拟地址到物理地址的映射更新到TLB中,使得后续对相同虚拟地址的访问不会再触发TLB重填异常。
处理其他TLB地址翻译相关的异常:根据recall slice 1的内容,除了TLB重填异常外,LoongArch指令系统下常见的TLB相关异常还包括取指操作页无效异常、load操作页无效异常、store操作页无效异常以及页修改异常。这些异常的处理相似,涉及页表的查找和物理页面的分配,并更新TLB表项。
异常处理完成:处理完成后,异常处理程序会将控制返回给被中断的程序。那个程序现在可以继续执行,由于TLB已被更新,相同的内存访问现在应该可以直接通过TLB进行地址转换,而无需再次触发异常。
通过上述过程,基于LoongArch处理器的Linux操作系统能够有效地处理TLB例外,保障内存访问的正确性和效率。这个过程不仅展示了硬件(TLB和LoongArch处理器)和软件(操作系统的页表管理和异常处理程序)的密切配合,也体现了现代计算机系统在处理内存访问时的复杂性和高效性。

C语言与指令系统的关系

C语言与指令系统的关系是基于如何将C语言的高级语句和操作映射到处理器执行的机器指令上。关系可以从多个方面来理解:
高级语言结构映射:C语言的高级构造,如算术语句、控制流语句(for循环、if语句、switch语句等)可以被直接映射为对应的机器指令或一系列机器指令序列。例如,算术运算语句(如加、减、乘、除)会映射到处理器执行的相应算术指令;for循环和while循环可以转换为条件跳转指令。
内存访问与地址空间映射:C语言中的变量访问和内存操作会映射为指令系统中的内存访问指令。具体的映射方式取决于变量的类型(全局、局部或动态分配的)以及对应的存储位置(如全局变量映射到静态数据区,局部变量映射到堆栈区,动态分配的数据映射到堆区)。
系统和库函数调用:C语言标准库和系统调用(比如文件IO、网络通信等)在指令系统级别上,通常通过特定的机器指令进行系统调用(如中断或陷入指令),进而由操作系统内核处理相应的功能。
外部设备交互:C语言程序中涉及到外部设备交互的部分,比如读取键盘输入、输出信息到屏幕或文件,最终也会转化为特定的指令和操作系统调用,由操作系统通过设备驱动程序与实际硬件设备进行交互。
通过编译过程,C语言代码被转换成对应的机器可执行指令。编译器的优化阶段会改进这些映射,尽可能高效地利用目标处理器的指令系统,包括选择最高效的指令和调整指令顺序以增强流水线和缓存的利用率。

系统初始化时PCI设备的探测过程?

系统初始化时,PCI设备的探测过程主要包括以下几个步骤:
初始化搜索参数:系统在开始探测之前,将初始总线号、初始设备号、初始功能号设为0。这是搜索PCI设备的起点。
构建配置空间地址:使用当前的总线号、设备号、功能号组成一个PCI配置空间地址。PCI配置空间地址用于访问设备的配置寄存器。
访问配置寄存器:通过构建的配置空间地址,访问其0号寄存器,检查其设备号。0号寄存器一般包含了设备的供应商ID和设备ID。
判断是否为有效设备:如果读出的设备号为全1或全0,表示无设备。否则,表示该地址对应一个有效的PCI设备。
BAR空间大小检测:对于有效的PCI设备,检查每个基地址寄存器(BAR)所需的空间大小。这是通过向寄存器写入全1的值,再读出来观察0的个数来实现的,从而得知该BAR所映射空间的大小。
多功能与桥设备检测:检测该设备是否为多功能设备;如果是,则递增功能号,重复步骤2-5的流程。如果该设备为桥设备,配置新的总线号,并使用新总线号从设备号0、功能号0开始递归调用,重复整个探测过程。
设备号递增:如果当前设备号不是31,则递增设备号,继续执行步骤2-6;如果设备号为31,并且总线号为0,则表示本次扫描结束。如果总线号非0,则退回到上一层递归调用。
通过以上步骤,系统可以得到整个PCI总线上的所有设备及其所需的所有空间信息。有了这些信息,就可以对所有的空间从大到小进行合理分配,并通过分配得到的基地址和设备的ID信息,加载相应的驱动程序以正常使用设备。

IO通信中DMA传输过程

在IO通信中,使用直接存储器访问(DMA)传输数据的一般过程如下:
预分配地址空间:首先,处理器或者操作系统为DMA传输预先分配一段连续的内存地址空间,这片空间将用于存放来自IO设备的数据或者存放待发送给IO设备的数据。
设置DMA控制器参数:处理器通过编程设置DMA控制器的相关参数,这些参数包括待传输数据的源地址和目标地址、数据传输的方向(从IO设备到内存,或者从内存到IO设备)、传输的字节大小,以及在传输完成后是否需要向处理器发出中断通知。
DMA控制器执行数据传输:DMA控制器根据设置的参数直接控制数据的传输,不需要处理器介入数据传输的每个步骤。DMA控制器直接访问内存,从IO设备读取数据并将数据写入预先分配的内存地址空间,或者从内存读取数据并发送到IO设备。
传输完成通知:一旦数据传输完成,DMA控制器会向处理器发出一个中断信号,通知处理器DMA操作已经完成。处理器随后可以处理或访问刚刚传输的数据。
处理器处理DMA请求:在接收到DMA完成的中断信号后,处理器可能会执行一些后续处理工作,例如根据需要更新数据处理状态,释放已用完的内存缓冲区,或准备新的DMA传输。
在这里插入图片描述
通过DMA方式,可以有效地在存储器和外部设备之间传输大量数据,而无需占用CPU大量资源来逐字节地处理数据,从而显著提高系统的数据处理效率。常见使用DMA的设备包括硬盘、SSD、网络接口卡以及各种外部接口设备等。

先行进位加法器结构及其verilog实现

先行进位加法器是一种改善行波进位加法器延迟问题的设计,通过并行计算每一位的进位来加速整体的加法过程。这种加法器的设计原理是基于进位生成因子(g)和进位传递因子(p)来提前计算每一位的进位,从而降低加法器的延迟。
下面是一个基本的先行进位加法器的Verilog实现。假设这是一个4位加法器的设计:

module carry_lookahead_adder_4bit(input [3:0] a, b,  // 输入的两个4位加数input cin,        // 输入的低位进位output [3:0] sum, // 输出的4位和output cout       // 输出的高位进位);wire [3:0] g;  // 进位生成因子
wire [3:0] p;  // 进位传递因子
wire [4:0] c;  // 进位// 计算进位生成因子和进位传递因子
assign g = a & b; // g[i] = a[i] & b[i]
assign p = a ^ b; // p[i] = a[i] ^ b[i]// 进位
assign c[0] = cin;
assign c[1] = g[0] | (p[0] & c[0]);
assign c[2] = g[1] | (p[1] & c[1]);
assign c[3] = g[2] | (p[2] & c[2]);
assign c[4] = g[3] | (p[3] & c[3]);// 计算和
assign sum = p ^ c[3:0]; // sum[i] = p[i] ^ c[i]
assign cout = c[4]; // 输出的高位进位endmodule

这个Verilog模块描述了一个4位的先行进位加法器。在该设计中:
g 和 p 分别为进位生成因子和进位传递因子。
c 为进位,其中 c[0] 是输入进位 cin,c[1] 到 c[4] 依次为各位的进位输出。
sum 为两个4位数相加的结果,而 cout 为从最高位溢出的进位。
用这种方式设计的先行进位加法器能有效减少加法运算的延迟,尤其适用于高性能数字电路系统设计。需要注意的是,对于更大位数的加法器,可以通过对4位加法器组件进行层次化级联,进一步构建起更大位数的加法系统。

Booth编码和华莱士树原理

Booth编码和华莱士树是两种用于高效计算乘法和加法的算法,分别用于处理乘法器中部分积的生成和加速多个数相加的过程。
Booth编码
Booth编码主要用于改进二进制乘法的过程。传统的二进制乘法通过多次的加法来实现,但这对于大型数字或是硬件实现来说效率不够高。Booth算法通过编码乘法过程中的乘数,减少了必要的加法次数,从而加速了乘法操作。
在这里插入图片描述
补码乘法,得到有规律的数列P(i)
在这里插入图片描述
booth乘法器根据P(i)设计,b数列每两个的差决定后面S的效果,即对A*2^n的处理,即对A的左移。
最后相加。
核心思想是在乘数的二进制表示中使用位串的形式将连续的1进行编码,利用这些编码规则对乘数进行重新表示,从而减少了部分积的数量。在硬件实现中,这意味着减少了加法器的使用次数,提高了乘法操作的效率。
具体来说,Booth算法识别乘数中连续的1序列,并将其转换为特定的加减操作,这些操作相对于直接采用简单二进制乘法需要较少的步骤来完成。比如,对于乘数的连续两位进行分析,根据前一位和后一位的关系(如从0变到1、从1变到0等),采取不同的处理策略(如加上乘数的部分值,或减去乘数的部分值等)。
华莱士树
把Booth算法中每次循环选出的操作一次性全部选好并相加。华莱士树 (Wallace Tree) 结构可以大幅降低多个数相加的硬件开销和延迟。
用到了CSA加法器:将3个N位数求和转化为2个N位数求和
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
华莱士树是一种硬件加法器结构,用于并行地将多个二进制数相加。其主要目的是减少多数相加时的延迟。通过将加法操作组织成树状结构,多个部分积可以并行地被加起来,从而减少整个加法操作的时间。
华莱士树的基本操作是将加法操作分解成多层,每一层使用多个全加器和半加器对部分积进行处理。通过逐层递进,最终将所有输入数加到一起。华莱士树的精髓在于其能够有效地平衡各级加法器中进位的传递,最终只需要一个更大的加法器来完成最后一步的加法操作。
在这里插入图片描述
图中间标注为 switch 的部分, 负责收集 8 个 Booth 核心生成的 8 个 32 位数, 进行类似矩阵转置的操作, 重新组织为 32 组 8 个一位数相加的格式, 输出给华莱士树, 并将 Booth 核心生成的 8 个 “末位加 1” 信号从 switch 部分右侧接出, (booth其中减去 [X] 补 的操作, 可以视作加上按位取反的 [X] 补 再末位加 1)提供给华莱士树最右侧的一位树及最后的加法器。 此外图中没有画出的是, 被乘数 X 送到 8 个 Booth 编码器时需要先扩展到 32 位, 并按照编码器所处的位置进行不同偏移量的左移操作。
华莱士树通过减少加法操作的层数和优化进位的传递方式,显著地减小了加法操作的延迟,特别适用于硬件乘法器,因为可以快速并行地合并乘法器生成的多个部分积。
在这里插入图片描述
Booth编码的目的是减小乘法器生成的部分积数量,而华莱士树的目的则是加速这些部分积的累加过程。两者合用在乘法器的设计中,可以显著提高数字电路处理乘法操作的速度和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot之请求映射原理

前言 我们发出的请求,SpringMVC是如何精准定位到那个Controller以及具体方法?其实这都是 HandlerMapping 发挥的作用,这篇博文我们以 RequestMappingHandlerMapping 为例并结合源码一步步进行分析。 定义HandlerMapping 默认 HandlerMappi…

Docker部署常见应用之桌面版系统ubuntu-desktop

文章目录 ubuntu-desktop 简介ubuntu-desktop 部署参考文章 ubuntu-desktop 简介 colinchang/ubuntu-desktop 是一个Docker镜像,基于KasmWeb⁠的 Ubuntu 22.04 桌面版(Web) Docker Image。镜像替换了阿里云Ubuntu Jammy镜像源,安…

重生之 SpringBoot3 入门保姆级学习(21、场景整合 Redis 定制对象序列化存储)

重生之 SpringBoot3 入门保姆级学习(21、场景整合 Redis 定制对象序列化存储) 6.4 定制化 6.4 定制化 需求:保存一个 Person 对象到 redis 创建 Person 类 package com.zhong.redis.entity;import lombok.AllArgsConstructor; import lombok…

浅谈C++基本框架内涵及其学习路线

目录 一.C的内涵本质 1. 面向对象编程(OOP) 2. 低级控制 3. 模板编程 4. 标准库(STL) 5. 多范式支持 二.学习路线 1. 基础阶段 C基础语法 函数 数组和指针 2. 面向对象编程 类和对象 继承和多态 运算符重载 3. 高级…

【服务的主从切换实现原理】

文章目录 主从架构介绍zookeeper利用ZK实现主从架构 主从架构介绍 主从服务架构是一种常见的分布式系统设计模式,常用于提高系统的性能、可用性和扩展性。在这种架构中,系统中的节点被分为两类:主节点(Master)和从节点…

Java基础面试重点-1

0. 符号: *:记忆模糊,验证后特别标注的知识点。 &:容易忘记知识点。 *:重要的知识点。 1. 简述一下Java面向对象的基本特征(四个),以及你自己的应用? 抽象&#…

R可视化:ggpubr包学习

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者 Xiao hong书:生信学习者 知hu:生信学习者 CDSN:生信学习者2 介绍 ggpubr是我经常会用到的R包,它傻瓜式的画图方式对很多初次接触R绘图的人来…

提升你的编程体验:自定义 PyCharm 背景图片

首先,打开 PyCharm 的设置菜单,点击菜单栏中的 File > Settings 来访问设置,也可以通过快捷键 CtrlAItS 打开设置。 然后点击Appearance & Behavior > Appearance。 找到Background image...左键双击进入。 Image:传入自己需要设置…

常见的 EVM 版本以及它们的区别

EVM(以太坊虚拟机)版本的演进是为了引入新的特性和改进以太坊平台的安全性、效率和功能性。每个版本通常伴随着以太坊网络的硬分叉,这是以太坊协议的重大升级。以下是一些常见的EVM版本及其主要区别: Homestead (2016年3月)&…

中国首台!紧随美国,重磅发布100比特中性原子量子计算机

2024年6月11日上午,“武汉量子论坛—2024”隆重开幕,国家自然科学基金委员会主任窦贤康院士,武汉大学校长张平文院士,以及叶朝辉、徐红星、祝世宁等院士出席大会。在会议上,中科酷原重磅发布国内首台原子量子计算机——…

利用 HTML5 Canvas 实现在线签字功能

目录 前言 一、HTML5 Canvas 简介 二、签字功能的实现 效果演示 完整代码 前言 在现代互联网应用中,有时我们需要让用户在网页上进行签字操作,比如确认文件、填写电子表格或者签署合同。利用 HTML5 的 canvas 画布,我们可以轻松地实现这一…

图片转Base64

在Python中, 可以使用内置的base64模块以及图像处理库(如PIL, 也称为Pillow)来将图片转换为Base64编码的字符串. 以下是一个简单的示例, 说明如何实现这一过程:首先, 需要安装Pillow库(如果尚未安装), 可以使用pip来安装: pip install pillow然后, 可以使用以下Python代码将图片…

RabbitMQ实践——交换器(Exchange)和绑定(Banding)

大纲 direct型交换器默认交换器命名交换器 fanout型交换器topic型交换器headers型交换器 RabbitMQ在概念上由三部分组成: 交换器(Exchange):负责接收消息发布者发布消息的结构,同时它会根据“绑定关系”(Ba…

基于SpringBoot+VueBBS论坛系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

sku与spu的区别!!!

一个 SPU 可以有多个 SKU。

攻防演练之-成功的钓鱼邮件溯源

书接上文,《网络安全攻防演练风云》专栏之攻防演练之-网络安全产品大巡礼二,这里。 演练第一天并没有太大的波澜,白天的时间过得很快。夜色降临,攻防演练中心内的灯光依旧明亮。对于网络安全团队来说,夜晚和白天并没有…

教育培训知识付费在线课程小程序开发

教育培训知识付费在线课程小程序功能概述 核心功能 课程报名与缴费:支持线上报名、缴费,自定义课程时间、人数等。 砍价功能:用户通过分享邀请好友参与砍价,享受低价购买课程的优惠。 视频课程:支持倍速播放&#x…

Linux 基本指令3

date指令 date[选项][格式] %Y--年 %m--月 %d--日 %H--小时 %M--分 %S--秒 中间可用其他符号分割,不能使用空格。 -s 设置时间,会返回设置时间的信息并不是改变当前时间 设置全部时间年可用-或者:分割日期和时间用空格分隔&#xff…

Qt创建静态库及静态库使用

Qt创建静态库及静态库使用 1. 创建一个库文件 选择静态库 将需要打包的.h 和.cpp文件添加到程序中, 在编译器版本下的debug和release模式下分别编译(右键项目,点击“qmake”,再点击“构建”)后,在对应的的build目录下…