在阅读本书之前,请读者尝试完成以下自测题,从而了解自己对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体系结构的函数栈的布局。
以上题目的答案都分布在本书的各章中。