《RISC-V 体系结构编程与实践(第2版)》互动:接龙解答作者笨叔出的思考题
<p>@goldjack、@hollyedward、@FuShenxiao、@andeyqi、@zsy-s,欢迎一起参与阅读 《RISC-V 体系结构编程与实践(第2版)》的小伙伴们,在阅读之余,来这里接龙解答本书籍作者给出的助力阅读的题目,要求:<span style="color:#1abc9c;">截止到2月10日,每人至少跟帖解答2章节的题目,不得重复上面已有网友解答的章节题目。</span>本部分的参与情况,将在活动评分里互动性的评分中体现。<strong>由于只有9个章节的题目,所以目前有1个名额,可只解答1个章节的题目,先到先得。</strong></p><p> </p>
<p><strong>作者笨叔助力阅读,给出的RISC-V思考题目</strong></p>
<p> </p>
<p>第1章:<br />
1.RISC-V体系结构有什么特点?<br />
2.RISC-V体系结构处理器包含多少个通用寄存器?<br />
3.RISC-V体系结构包含几种处理器模式?它们分别有什么作用?</p>
<p><br />
第3章:<br />
1.RISC-V指令集有什么特点?<br />
2.RISC-V指令编码格式分成几类?<br />
3.什么是零扩展和符号扩展?<br />
4.什么是PC相对寻址?</p>
<p><br />
第4章:<br />
1.请阐释RISC-V体系结构下的函数调用规范。<br />
2.在函数调用过程中,如果函数传递的参数大于8,如何传递参数?<br />
3.假设函数调用关系为main()→func1()→func2(),请画出RSIC-V体系结构下函数栈的布局。</p>
<p><br />
第5章:<br />
1.什么是汇编器?<br />
2.如何给汇编代码添加注释?<br />
3.什么是符号?<br />
4.什么是伪指令?</p>
<p><br />
第6章:<br />
1.什么是链接器?为什么链接器简称LD?<br />
2.链接脚本中的输入段和输出段有什么区别?<br />
3.什么是加载地址和虚拟地址?</p>
<p><br />
第7章:<br />
1.在内嵌汇编代码中,关键字“asm”“volatile”“inline”以及“goto”分别代表什么意思?<br />
2.在内嵌汇编代码的输出部分里,“=”和“+”分别代表什么意思?<br />
3.在内嵌汇编代码中,如何表示输出部分和输入部分的参数?</p>
<p><br />
第8章:<br />
1.在RISC-V处理器中,异常有哪几类?<br />
2.同步异常和异步异常有什么区别?<br />
3.在RISC-V处理器中,异常发生后CPU自动做了哪些事情?软件需要做哪些事情?</p>
<p><br />
第9章:<br />
1.请简述中断处理的一般过程。<br />
2.什么是中断现场?对于RISC-V处理器来说,中断现场应该保存哪些内容?<br />
3.中断现场保存到什么地方?</p>
<p><br />
第10章:<br />
1.在计算机发展历史中,为什么会出现分段机制和分页机制?<br />
2.为什么页表要设计成多级页表?直接使用一级页表是否可行?多级页表又引入了什么问题?<br />
3.为什么页表存放在主内存中而不是存放在芯片内部的寄存器中?<br />
4.MMU查询页表的目的是找到虚拟地址对应的物理地址,页表项中有指向下一级页表基地址的指针,那它指向的是下一级页表基地址的物理地址还是虚拟地址?</p>
<p> </p>
<p>第1章:问题回答</p>
<p>1.RISC-V体系结构有什么特点?</p>
<p>==></p>
<p>对学术界和工业界完全开放,开源的架构</p>
<p>属于一个通用指令集体系结构</p>
<p>真正适合硬件实现的指令集体系结构</p>
<p>实现最小的整数指令集作为基础指令集,在此基础上实现众多众多可选扩展</p>
<p>支持IEEE 754浮点标准</p>
<p>支持众多扩展指令集</p>
<p>支持多核异构体系结构</p>
<p>支持可选的压缩指令集</p>
<p>支持虚拟化扩展</p>
<p>支持可伸缩矢量指令扩展 </p>
<p><br />
2.RISC-V体系结构处理器包含多少个通用寄存器?</p>
<p>==></p>
<p>包括32个整形通用寄存器x0-x31,32个浮点通用寄存器 f0~f31</p>
<p><br />
3.RISC-V体系结构包含几种处理器模式?它们分别有什么作用</p>
<p>==></p>
<p>U 模式用于运行应用程序</p>
<p>S模式用于运行操作系统,为应用程序提供服务</p>
<p>M模式用于运行SBI固件,为操作系统提供服务</p>
本帖最后由 andeyqi 于 2024-11-26 17:55 编辑
<p>第3章:问题回答<br />
1.RISC-V指令集有什么特点?</p>
<p>==》</p>
<p>RISC-V 指令集采用了模块化的设计方法,设计了一个最小集合的基础指令集,这个最小指令集可以完整的是实现一个软件栈,其他功能可以在此基础上通过模块化的方式叠加扩展,用于支持浮点,乘法,除法,矢量运算等。</p>
<p><br />
2.RISC-V指令编码格式分成几类?</p>
<p>==》</p>
<p>指令格式可以分为6种</p>
<ul>
<li>R类型:寄存器与寄存器算术指令。</li>
<li>I类型:寄存器与立即数算术指令或者加载指令。</li>
<li>S类型:存储指令。</li>
<li>B类型:条件跳转指令。</li>
<li>U类型:长立即数操作指令。</li>
<li>J类型:无条件跳转指令。</li>
</ul>
<p>3.什么是零扩展和符号扩展?</p>
<p>==》</p>
<p>符号扩展:对于一个需要扩展的立即数的最高位作为符号位进行扩展,最高位的符号位为1 前面的数据全部填充为1,0则填充为0</p>
<p>零扩展:扩展时不考虑符号位,直接在前面填充为0</p>
<p> </p>
<p>4.什么是PC相对寻址?</p>
<p>==》</p>
<p>使用PC + offset 的形式进行寻址方式,RISC-V 提供了AUIPC 指令根据当前PC的值 算出 要寻址的偏移的大小,但是AUIPC 指令编码格式的限制只能寻址到4KB边界的位置,随影通常配合ADDI 指令联合使用来实现32位地址空间的PC 相对寻址。</p>
本帖最后由 goldjack 于 2024-11-26 19:14 编辑
<p class="p" style="text-indent:0.0000pt; padding:0pt 0pt 0pt 0pt ; text-align:left">第5章:<br />
1.什么是汇编器?</p>
<p>答:汇编器是将汇编代码翻译为机器目标代码的程序。</p>
<p><br />
2.如何给汇编代码添加注释?</p>
<p>答:“#”字符开始,表明其后的内容为注释。</p>
<p><br />
3.什么是符号?</p>
<p>答:符号是一个核心概念。程序员使用符号命名事物,连接器使用符号链接,调试器使用符号调试。符号可以代表它所在的地址,也可以当做变量或者函数使用。</p>
<p><br />
4.什么是伪指令?</p>
<p>答:伪指令是对汇编器发出的命令,它在源程序汇编期间由汇编器处理。伪指令是由汇编器预处理的指令,可以分解为几条指令的集合。</p>
<p> </p>
<div class='shownolgin' data-isdigest='no'><p class="p" style="text-indent:0.0000pt; padding:0pt 0pt 0pt 0pt ; text-align:left"><span style="font-size:12pt"><span style="background:#ffffff"><span style="line-height:16.8000pt"><span style="font-family:Calibri"><span style="font-size:10.5000pt"><span style="background:#ffffff"><span style="font-family:微软雅黑"><span style="color:#333333"><span style="letter-spacing:0.0000pt"><span style="font-style:normal"><font face="微软雅黑">第</font><font face="微软雅黑">6章:</font></span></span></span></span></span></span><br />
<span style="font-size:10.5000pt"><span style="background:#ffffff"><span style="font-family:微软雅黑"><span style="color:#333333"><span style="letter-spacing:0.0000pt"><span style="font-style:normal"><font face="微软雅黑">1.什么是链接器?为什么链接器简称LD?</font></span></span></span></span></span></span></span></span></span></span></p>
<p class="p" style="text-indent:0.0000pt; padding:0pt 0pt 0pt 0pt ; text-align:left"><span style="font-size:12pt"><span style="background:#ffffff"><span style="line-height:16.8000pt"><span style="font-family:Calibri"><span style="font-size:10.5000pt"><span style="background:#ffffff"><span style="font-family:微软雅黑"><span style="color:#333333"><span style="letter-spacing:0.0000pt"><span style="font-style:normal"><font face="微软雅黑">答:链接器是用来完成链接过程的工具。而链接指的是把编译过程中生成的目标文件(也包括用到的标准库函数目标文件)的代码段、数据段以及符号表等内容收集起来,并按照某种格式(如</font><font face="微软雅黑">ELF)组合成一个可执行二进制文件的过程。操作系统发展的早期并没有链接器的概念,操作系统的加载器(Loader,LD)做了所有的工作。后来操作系统越来越复杂,慢慢出现了链接器,所以LD成为链接器的代名词。</font></span></span></span></span></span></span></span></span></span></span></p>
<p class="p" style="text-indent:0.0000pt; padding:0pt 0pt 0pt 0pt ; text-align:left"><br />
<span style="font-size:12pt"><span style="background:#ffffff"><span style="line-height:16.8000pt"><span style="font-family:Calibri"><span style="font-size:10.5000pt"><span style="background:#ffffff"><span style="font-family:微软雅黑"><span style="color:#333333"><span style="letter-spacing:0.0000pt"><span style="font-style:normal"><font face="微软雅黑">2.链接脚本中的输入段和输出段有什么区别?</font></span></span></span></span></span></span></span></span></span></span></p>
<p class="p" style="text-indent:0.0000pt; padding:0pt 0pt 0pt 0pt ; text-align:left"><span style="font-size:12pt"><span style="background:#ffffff"><span style="line-height:16.8000pt"><span style="font-family:Calibri"><span style="font-size:10.5000pt"><span style="background:#ffffff"><span style="font-family:微软雅黑"><span style="color:#333333"><span style="letter-spacing:0.0000pt"><span style="font-style:normal"><font face="微软雅黑">答:</font></span></span></span></span></span></span><span style="font-size:10.5000pt"><span style="background:#ffffff"><span style="font-family:微软雅黑"><span style="color:#333333"><span style="letter-spacing:0.0000pt"><span style="font-style:normal"><font face="微软雅黑">链接脚本中的输入段</font></span></span></span></span></span></span><span style="font-size:10.5000pt"><span style="background:#ffffff"><span style="font-family:微软雅黑"><span style="color:#333333"><span style="letter-spacing:0.0000pt"><span style="font-style:normal"><font face="微软雅黑">用来告诉链接器如何输入文件映射到内存布局。输入段包括输入文件以及对应的输入段。输出段是链接器处理输入段后生成的最终可执行文件中的部分。一个输出段有虚拟内存地址(</font><font face="微软雅黑">VMA)和加载内存地址(LMA)两个地址。</font></span></span></span></span></span></span></span></span></span></span></p>
<p class="p" style="text-indent:0.0000pt; padding:0pt 0pt 0pt 0pt ; text-align:left"><br />
<span style="font-size:12pt"><span style="background:#ffffff"><span style="line-height:16.8000pt"><span style="font-family:Calibri"><span style="font-size:10.5000pt"><span style="background:#ffffff"><span style="font-family:微软雅黑"><span style="color:#333333"><span style="letter-spacing:0.0000pt"><span style="font-style:normal"><font face="微软雅黑">3.什么是加载地址和虚拟地址?</font></span></span></span></span></span></span></span></span></span></span></p>
<p class="p" style="text-indent:0.0000pt; padding:0pt 0pt 0pt 0pt ; text-align:left"><span style="font-size:12pt"><span style="background:#ffffff"><span style="line-height:16.8000pt"><span style="font-family:Calibri"><span style="font-size:10.5000pt"><span style="background:#ffffff"><span style="font-family:微软雅黑"><span style="color:#333333"><span style="letter-spacing:0.0000pt"><span style="font-style:normal"><font face="微软雅黑">答:加载地址(</font><font face="微软雅黑">Load Memory Address,LMA)通常指的是指令中指定的内存地址,用于指示CPU从该地址读取数据。</font></span></span></span></span></span></span><span style="font-size:10.5000pt"><span style="background:#ffffff"><span style="font-family:微软雅黑"><span style="color:#333333"><span style="letter-spacing:0.0000pt"><span style="font-style:normal"><font face="微软雅黑">加载地址可以是虚拟地址或物理地址,取决于是否启用了虚拟地址。</font></span></span></span></span></span></span><span style="font-size:10.5000pt"><span style="background:#ffffff"><span style="font-family:微软雅黑"><span style="color:#333333"><span style="letter-spacing:0.0000pt"><span style="font-style:normal"><font face="微软雅黑">虚拟地址</font><font face="微软雅黑">(Virtual Memory Address, VMA)是CPU生成的一个地址,用于访问主存,必须经过地址翻译转换为物理地址。</font></span></span></span></span></span></span></span></span></span></span></p>
</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页:
[1]