问题1 :支持arm V8的Linux内核的异常向量地址在哪里?
a )异常向量基址为0xffffffc000081800。 通过查看编译的linux内核的System.map文件,可以确定异常向量表的基址。 也可以在反汇编生成的支持armv8的linux内核中确认。 Armv8异常向量的定义位于内核的arch/arm/kernel/entry.S中。 其摘录如下。
/*
*执行向量。
*/
. macroventry标签
. align7
b\label
. endm
. align11
是条目vectors )
ventr Yel1_ sync _ invalid//synchronous El 1t
ventryel1_irq_invalid //IRQ EL1t
ventryel1_fiq_invalid //FIQ EL1t
ventr Yel1_ error _ invalid//errorel 1t
ventr Yel1_ sync//synchronous El 1h
ventryel1_irq //IRQ EL1h
ventryel1_fiq_invalid //FIQ EL1h
ventr Yel1_ error _ invalid//errorel 1h
ventr Yel0_ sync//synchronous 64-bitel 0
ventryel0_irq //IRQ 64-bit EL0
ventr Yel0_ fiq _ invalid//fiq 64-bitel 0
ventr Yel0_ error _ invalid//error 64-bitel 0
#ifdefCONFIG_AARCH32_EMULATION
ventr Yel0_ sync _ compat//synchronous 32-bitel 0
ventr Yel0_ IRQ _ compat//IRQ 32-bitel 0
ventr Yel0_ fiq _ invalid _ compat//fiq 32-bitel 0
ventr Yel0_ error _ invalid _ compat//error 32-bitel 0
#else
ventr Yel0_ sync _ invalid//synchronous 32-bitel 0
ventr Yel0_ IRQ _ invalid//IRQ 32-bitel 0
ventr Yel0_ fiq _ invalid//fiq 32-bitel 0
ventr Yel0_ error _ invalid//error 32-bitel 0
#endif
是结尾vectors )
问题2 :找到存储在TLB中的ARMv8的页面表格式
答:我只找到了页表的格式。 未找到TLB格式。
ARMv8支持将4KB页面大小的4级页面表转换为64KB页面大小的3级页面表。
以下是从内核源文档中找到的信息。
AArch64 Linux memory layout:
开始结束大小用户
————- -请参阅
00000000000000000000000000000000007 ffffff 512 GB用户
ffffff 800000000 fffffffbbfffff~240 GB vmalloc
fffffffbbfff 0000 ffffffffffff 64kb [ guard page ]
ffffffbc00000000 fff
fffbdffffffff 8GB vmemmap
ffffffbe00000000 ffffffbffbffffff ~8GB [guard,future vmmemap]
ffffffbffc000000 ffffffbfffffffff 64MB modules
ffffffc000000000 ffffffffffffffff 256GB memory
Translation table lookup with 4KB pages:
+——–+——–+——–+——–+——–+——–+——–+——–+
|63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0|
+——–+——–+——–+——–+——–+——–+——–+——–+
| | | | | |
| | | | | v
| | | | | [11:0] in-page offset
| | | | +-> [20:12] L3 index
| | | +———–> [29:21] L2 index
| | +———————> [38:30] L1index
| +——————————->[47:39] L0 index not used)
+————————————————->[63] TTBR0/1
Translation table lookup with 64KB pages:
+——–+——–+——–+——–+——–+——–+——–+——–+
|63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0|
+——–+——–+——–+——–+——–+——–+——–+——–+
| | | | |
| | | | v
| | | | [15:0] in-page offset
| | | +———-> [28:16] L3 index
| | +————————–> [41:29] L2index only 38:29 used)
| +——————————-> [47:42] L1 index not used)
+————————————————->[63] TTBR0/1
问题3:ARMv8中重要的控制寄存器的各位的意思是什么?
答:源码中没找到对ARMv8控制寄存器的详细描述。
1. 关于SPSR,该寄存器是CPSR的副本,当在不同模式间转换时,该寄存器保存CPSR的内容,用于状态恢复。
在arch/arm64/include/asm/ptrace.h中找到AArch64的spsr寄存器某些位的定义,经过与ARMv7的对比发现,以下定义的位于ARMv7中定义的位意义相同。
/*AArch64 SPSR bits */
#definePSR_F_BIT 0x00000040
#definePSR_I_BIT 0x00000080
#definePSR_A_BIT 0x00000100
#definePSR_D_BIT 0x00000200
#definePSR_Q_BIT 0x08000000
#definePSR_V_BIT 0x10000000
#definePSR_C_BIT 0x20000000
#definePSR_Z_BIT 0x40000000
#define PSR_N_BIT 0x80000000
2. ARMv8中的系统控制寄存器有多个,但与ARMv7不同的是:ARMv8中抛弃了“协处理器”的概念,进而就没了MCR,MRC类的指令,见参考资料[3],其系统控制都是通过MSR,MRS类指令进行。通过阅读Linux内核源码发现,主要的控制寄存器有:
hcr_el2:el2中的hypervisor配置寄存器
cnthctl_el2:可配置通用时钟
另外还有,vmpidr_el2;vpidr_el2;sctlr_el1:cptr_el2;hstr_el2;spsr_el2;vbar_el1;ttbr0_el1;ttbr1_el1;sctlr_el1
参考资料
[1] ARMv8的编译器binutils,结构体aarch64_opcode_table定义见line 1208
[2] 结构体aarch64_opcode定义,line451
[3] 《ARMv8 InstructionSet Overview 》page11