| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> ARM64架构题目答案 -> 正文阅读 |
|
[嵌入式]ARM64架构题目答案 |
1.A64指令集支持64位宽的数据和地址寻址,为什么指令的编码宽度只有32位 答:遵循简单源于规整的原则。 2.下面几条mov指令,哪些能成功,哪些会失败
答:armv8体系结构中?mov指令有三种模式:
别名为MOVN 将一个立即数左移16/32/48位放入寄存器,通常此指令用于移动位掩码,假设想要将位掩码0xFFFF_FFFF_0000_FFFF移至x0,然后将0xffff移至左侧16位,但是如果取反该值,0xFFFF_FFFF_0000_FFFFF, 例如: MOVN x0, 0XFFFF, lsl 16 //x0值为0xFFFF_FFFF_0000_FFFFF
别名为MOVZ,将立即数(16位)移至寄存器,并且该立即数之外的其他位均设置为0,。可以将立即数向左移0/16/32/48位
别名为orr(immediate), 所以根据以上三个规则,第二条指令有问题mov x0, 0x1abcd,其他均正常。 3.在下面的示例代码中,X0和X1寄存器的值分别是多少
x0为string1字符串的前8个字节 x1表示string1的地址 4.在下面示例代码中,X0寄存器的值是多少
sbc为带进位的减法指令,指令格式:sub <Xd>, <Xn>, <Xm> 计算结果是:Xn-Xm-1+C 所以x0 = 1 5.检查数据array[0, index-1]是否越界需要判断两个条件,一是输入值是否大于等于index,二是输入值是否小于0。如下两条指令来实现数组边界检查的功能,其中X0为数组的边界index,X1为输入值input。请解释这两条指令为什么能实现数组越界检查。
subs是带进位的减法,x0为数组边界index,x1为输入值input, x1 - x0 => input - index 上边界:b.hs?判断条件是?大于等于?即?input >= index则会出现OutoIndex。 下边界:b.hs还有一个条件是Carry标志位1,input -> 0 => x0 -> 0, input应该是大于0的才对,如果input小于0,进位标志位会被置位。所有跳转OutofIndex 6.在下面的汇编宏中,第2行预编译后的指令是?
\()?表示连接前后的字符,\表示解析宏参数 7.关于链接器,请解释:链接地址、虚拟地址以及加载地址。当一个程序的代码段的链接地址与加载地址不一致时,我们应该怎么做才能让程序正确运行? 链接地址:在编译链接时指定的地址,编程人员设想将来程序要运行的地址。 虚拟地址:对于每个进程来说都是认为自己用于所有的地址空间,这个地址空间就是虚拟地址。 加载地址:代码存储的物理地址。 一开始程序运行在加载地址上,想要程序运行在链接地址上,必须要经过重定位。 8.在ARM64处理器中,异常发生后CPU自动做了哪些事情?软件需要做哪些事情?异常返回时,它是返回到发生异常的指令还是下一条指令?什么是中断现场?对于ARM64处理器来说,中断现场应该保存哪些内容?中断现场保存到什么地方?
异常发生后CPU做的事:
软件做的事: ? ? 根据异常发生的类型,跳转到合适的异常向量表,异常向量表的每个表项会保存一个异常处理的跳转函数,然后跳转到恰当的异常处理函数并处理异常。 2. 异常返回:
3.中断现场 ? ? 保存被中断进程的寄存器和cpu状态 4.ARM64中断现场保存的内容 保存x0-x29寄存器、ELR_EL1(PC)、SPSR_EL1(pstate)、如果中断发生在EL0,还会保存sp_el0(sp),如果中断发生在EL1则把当前栈的sp保存起来。其他寄存器还要保存。 5.中断现场保存的地方。 ? ? 保存在被中断进程的内核栈上。 注意:当中断发生在用户空间时,用户空间的栈指针sp_el0保存起来的,在中断退出时,又重新取出来赋值给sp_el0的,所以在内核空间中sp_el0寄存器是没有被使用的。 9.为什么页表要设计成多级页表?直接使用一级页表是否可行?多级页表又引入了什么问题?请简述ARM64处理器的四级页表的映射过程,假设页表粒度为4KB,地址宽度为48位。 1.多级页面和一级页表: 现代操作系统都是多进程的系统,并且每个进程都有自己的页表,如果计算机的内存是4GB,每个页的粒度为4KB,采用1级页表,要访问整个4G页面,需要1,048,576个页表项,每个页表项如何占用4字节内存,则会需要4MB的内存,操作系统中有成百上千的进程,这样每个进程都要用4MB的内存来管理页面,实在是浪费内存。 2.多级页表引入了什么问题? 不清楚 3.ARM64处理器4级页表 ? 10.ARMv8架构处理器主要提供两种类型的内存属性,分别是普通类型(normal memory)内存和设备类型(device memory)内存,它们之间有什么区别?
11.在打开MMU时,为什么需要建立恒等映射? 因为指令已经在流水线中,如果没有建立恒等映射,执行重定位的话,在流水线中的指令将会执行失败。 12.请简述直接映射,全映射以及组相联映射的高速缓存的区别。什么是高速缓存的重名问题?什么是高速缓存的同名问题?VIPT类型的高速缓存会产生重名问题吗?
根据每个组(set)的高速缓存行数,cache可以分成不同的类。当每个组只有一个行cache?line时,称为直接映射高速缓存。 ? 如上图,用一个简单小巧的cache来说明,这个cache只有4行cache line,每行有4个字(word,一个字是4个Byte),总共64Byte。这个cache控制器可以使用两个比特位(bits[3:2])来选择cache?line中的字,以及使用另外两个比特位(bits[5:4])作为索引(Index),选择4个cache?line中的一个,其余的比特位用于标记值(Tag). ? ? 当这个cache中查询,当索引域和标记域的值和查询的地址相等,并且有效位显示这个cache line包含有效的数据时,则发生cache命中,那么可以使用偏移域来寻址cache?line中的数据。如果cache?line包含有效数据,但是标记域是其他地址的值,那么这个cache?line需要被替换。因此,在这个cache中,主存储器中所有bit[5:4]相同值的地址都会映射到同一个cache line中(根据cache line的个数,将内存进行了分组,索引字段相同的是一组,然后每次这组中的一个内存block存储在这个cache中),并且同一时刻只有一个cache line,因为cache line被频繁换入换出,会导致严重的cache颠簸(cache thrashing)。
? ? 为了解决直接映射高速缓存中的cache颠簸问题,组相联的cache结构在现代处理器中得到广泛应用。 以下是一个组相联示意图
cache查找过程: ?根据index取出每组中的cache line,然后比较取出的每个tag是否是我们需要的,如果某一个cache line是我们需要的,使用offset查找对应的字节。
多个cache组映射到同一个物理地址上。
采用VIPT方式也有可能导致高速缓存重名问题。在VIPT中,使用虚拟地址的索引域来查找cache组,这时有可能导致多个cache组映射到同一个物理地址上。 它是以4KB大小为一个页面进行管理的,那么对于一个页来说,虚拟地址和物理地址的低12bit(bit(11:0))是一样的。因此,不同的虚拟地址映射到同一个物理地址,这些虚拟地址页面的低12位是一样的。如果索引域位于bit[11:0]范围内,那么就不会发生高速缓存别名。例如,cache?line是32Byte,那么数据域偏移offset使用5bit,有128个cache组,那么索引域使用7bit,这种情况下刚好不会发生别名。 13.在ARM64处理器中,什么是内部共享和外部共享的高速缓存?什么是PoU和PoC
14.假设系统中4个CPU,每个CPU都有各自的一级高速缓存,处理器内部实现的是MESI协议,它们都想访问相同地址A,大小为64字节,这4个CPU的高速缓存在初始状态下没有缓存数据A。在T0时刻,CPU0访问数据A。在T1时刻,CPU1访问数据A。在T2时刻,CPU2访问数据A。在T3时刻,CPU3想更新数据A的内容。请依次说明,T0-T3时刻,4个CPU中高速缓存行的变化情况。
15.DMA和高速缓存容易产生缓存一致性问题。
16.为什么操作系统在切换(或修改)页表时需要先刷新对应的TLB表项然后再切换页表项? 因为TLB表项缓存的是虚拟地址到物理地址的对应关系,在操作系统修改了切换或者修改了页表后虚拟地址和物理地址的对应关系就发生了变化,如果不刷新TLB表项,将导致获取的物理地址可能是旧的物理地址或者不是切换后进程的对应物理地址。 17.下面是一个无效指令高速缓存的代码片段,请解释为什么在无效指令高速缓存之后要发送一个IPI中断,而且这个IPI中断的回调函数还是空的。
https://mp.weixin.qq.com/s/PM7EJYHP7PutHBkJ4oCQ9g 18.假设在下面的执行序列中: CPU0先执行了a=1和b=1,接着CPU1一直循环判断b是否等于1,如果等于1则跳出while循环,最后循环"assert(a==1)"语句来判断a是否等于1 那么assert语句有可能会失败吗? 可能会失败, 修改方法: CPU0?? ??? ??? ??? ??? ??? ??? ?? ? CPU1 {? ? ? A? = 1;?? ??? ??? ??? ??? ?? ? { ? ? smp_wmb();?? ??? ??? ??? ??? ?? ? while(b == 0) continue; ? ? b = 1;?? ??? ??? ??? ??? ??? ?? ? smp_rmb(); }?? ??? ??? ??? ??? ??? ??? ??? ?? ? ?assert(a == 1); ?? ??? ??? ??? ??? ??? ??? ??? ?? ? } 19.假设CPU0使用ldrxb/stxrb指令对0x341B0地址进行独占访问操作,CPU1也使用ldrxb/stxrb指令对0x341B4地址进行独占读操作,CPU1能成功独占访问吗? 可以独占。 20.假设函数调用关系为main()->func1()->func2(),请画出ARM64架构的函数栈的布局。
?汇编:
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/27 10:16:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |