购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

ARM64体系结构自测题

在阅读本书之前,请读者尝试完成以下自测题,从而了解自己对ARM64体系结构的掌握程度。一共有20道题,每道题5分,总分100分。

1.A64指令集支持64位宽的数据和地址寻址,为什么指令的编码宽度只有32位?

2.下面几条MOV指令中,哪些能执行成功?哪些会执行失败?

mov x0, 0x1234
mov x0, 0x1abcd
mov x0, 0x12bc0000
mov x0, 0xffff0000ffff

3.在下面的示例代码中,X0和X1寄存器的值分别是多少?

string1:
      .string "Booting at EL"
ldr x0,  string1
ldr x1,  =string1

4.在下面的示例代码中,X0寄存器的值是多少?

mov x1, #3
mov x2, #1
sbc x0, x1, x2

5.检查数组array[0, index−1]是否越界需要判断两个条件,一是输入值是否大于或等于index,二是输入值是否小于0。如下两条指令可实现数组越界检查的功能,其中X0寄存器存储了数组的边界index,X1为输入值input。请解释这两条指令为什么能实现数组越界检查。

subs xzr,x1,x0
b.hs OutOfIndex

6.下面是kernel_ventry宏的定义。

     .macro kernel_ventry, el, label
     b    el\()\el\()_\label
     .endm

下面的语句调用kernel_ventry宏,请解释该宏是如何展开的。

kernel_ventry   1, irq

7.关于链接器,请解释链接地址、虚拟地址以及加载地址。当一个程序的代码段的链接地址与加载地址不一致时,我们应该怎么做才能让程序正确运行?

8.在ARM64处理器中,异常发生后CPU自动做了哪些事情?软件需要做哪些事情?在发生异常后,CPU是返回发生异常的指令还是下一条指令?什么是中断现场?对于ARM64处理器来说,中断现场应该保存哪些内容?中断现场保存到什么地方?

9.为什么页表要设计成多级页表?直接使用一级页表是否可行?多级页表又引入了什么问题?请简述ARM64处理器的4级页表的映射过程,假设页面粒度为4 KB,地址宽度为48位。

10.ARMv8体系结构处理器主要提供两种类型的内存属性,分别是普通类型内存(normal memory)和设备类型内存(device memory),它们之间有什么区别?

11.在使能MMU时,为什么需要建立恒等映射?

12.请简述直接映射、全相连映射以及组相连映射的高速缓存的区别。什么是高速缓存的重名问题?什么是高速缓存的同名问题?VIPT类型的高速缓存会产生重名问题吗?

13.在ARM64处理器中,什么是内部共享和外部共享的高速缓存?什么是PoU和PoC?

14.假设系统中有4个CPU,每个CPU都有各自的一级高速缓存,处理器内部实现的是MESI协议,它们都想访问相同地址的数据 a ,大小为64字节,这4个CPU的高速缓存在初始状态下都没有缓存数据 a 。在 T 0时刻,CPU0访问数据 a 。在 T 1时刻,CPU1访问数据 a 。在 T 2时刻,CPU2访问数据 a 。在 T 3时刻,CPU3想更新数据 a 的内容。请依次说明, T 0~ T 3时刻,4个CPU中高速缓存行的变化情况。

15.DMA缓冲区和高速缓存容易产生缓存一致性问题。从DMA缓冲区向设备的FIFO缓冲区搬运数据时,应该如何保证缓存一致性?从设备的FIFO缓冲区向DMA缓冲区搬运数据时,应该如何保证缓存一致性?

16.为什么操作系统在切换(或修改)页表项时需要先刷新对应的TLB表项后切换页表项?

17.下面是关于无效指令高速缓存的代码片段,请解释为什么在使指令高速缓存失效之后要发送一个IPI,而且这个IPI的回调函数还是空的。

void flush_icache_range(unsigned long start, unsigned long end)
{
  flush_icache_range(start, end);
  smp_call_function(do_nothing, NULL, 1);
}

18.假设在下面的执行序列中,CPU0先执行了 a =1和 b =1,接着CPU1一直循环判断 b 是否等1,如果等于1则跳出while循环,最后执行“assert ( a == 1)”语句来判断 a 是否等于1,那么assert语句有可能会出错吗?

CPU0                           CPU1
-------------------------------------------------------------
void func0()                  void func1()
{                             {
     a = 1;                      while (b == 0) continue;
     b = 1;                      assert (a == 1)
}                              }

19.假设CPU0使用LDRXB/STXRB指令对0x341B0地址进行独占访问操作,CPU1也使用LDRXB/STXRB指令对0x341B4地址进行独占读操作,CPU1能成功独占访问吗?

20.假设函数调用关系为main()→func1()→func2(),请画出ARM64体系结构的函数栈的布局。

以上题目的答案都分布在本书的各章中。 PXzk62Qmf35CnUcaWr8JglMq7sQqeJoz9LMFBCLpQITT554BS4wMw291jJ0bgaUU

点击中间区域
呼出菜单
上一章
目录
下一章
×