问题1:支持ARMv8的Linux内核异常向量地址在哪?
答:异常向量基地址在0xffffffc000081800。通过查看编译后的linux内核的System.map文件,能确定异常向量表的基地址。通过反汇编生成的支持armv8的linux内核也可以证实。Armv8的异常向量表的定义在内核的arch/arm/kernel/entry.S中,将其摘录如下:
/*
* Exception vectors.
*/
.macro ventry label
.align 7
b label
.endm
.align 11
ENTRY(vectors)
ventry el1_sync_invalid //Synchronous EL1t
ventry el1_irq_invalid //IRQ EL1t
ventry el1_fiq_invalid //FIQ EL1t
ventry el1_error_invalid //Error EL1t
ventry el1_sync //Synchronous EL1h
ventry el1_irq //IRQ EL1h
ventry el1_fiq_invalid //FIQ EL1h
ventry el1_error_invalid //Error EL1h
ventry el0_sync //Synchronous 64-bit EL0
ventry el0_irq //IRQ 64-bit EL0
ventry el0_fiq_invalid //FIQ 64-bit EL0
ventry el0_error_invalid //Error 64-bit EL0
#ifdefCONFIG_AARCH32_EMULATION
ventry el0_sync_compat //Synchronous 32-bit EL0
ventry el0_irq_compat //IRQ 32-bit EL0
ventry el0_fiq_invalid_compat //FIQ 32-bit EL0
ventry el0_error_invalid_compat //Error 32-bit EL0
#else
ventry el0_sync_invalid //Synchronous 32-bit EL0
ventry el0_irq_invalid //IRQ 32-bit EL0
ventry el0_fiq_invalid //FIQ 32-bit EL0
ventry el0_error_invalid //Error 32-bit EL0
#endif
END(vectors)
问题2:找出TLB中存放的ARMv8的页表格式
答:只找到了页表的格式。TLB中的格式没找到。
ARMv8支持4KB页大小的4级页表转换到64KB页大小的3级页表转换。
以下是从内核源码的Documentation找到的信息。
AArch64 Linux memory layout:
Start End Size Use
-----------------------------------------------------------------------
0000000000000000 0000007fffffffff 512GB user
ffffff8000000000 ffffffbbfffeffff ~240GB vmalloc
ffffffbbffff0000 ffffffbcffffffff 64KB [guardpage]
ffffffbc00000000 ffffffbdffffffff 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
http://kernel.ubuntu.com/git?p=jk/arm64/binutils.git;a=blob;f=opcodes/aarch64-tbl.h;h=d360b1406718257da86050f5b3a760cd02196250;hb=aarch64
[2] 结构体aarch64_opcode定义,line451
http://kernel.ubuntu.com/git?p=jk/arm64/binutils.git;a=blob;f=include/opcode/aarch64.h;h=98529954ea098349eb16572d4915f4edbd2e7b5d;hb=aarch64
[3] 《ARMv8 InstructionSet Overview 》page11
上一篇:arm平台linux异常处理流程
下一篇:ARMv8(aarch64)页表建立过程详细分析
推荐阅读最新更新时间:2024-11-03 23:47
设计资源 培训 开发板 精华推荐
- 基于STM32的智能加油系统
- NCV78XXXBSTR1GEVB:NCV78xxx LED 虚拟助推器
- LTC1662IMS8 超低功耗、双 10 位 DAC 在 MSOP 中的典型应用
- LM2904DMR2G 函数发生器运算放大器的典型应用
- DER-417 - 5mW空载输入功率,8 W待机电源
- 使用 Analog Devices 的 AD9144BCPZ 的参考设计
- LT1634AIS8-4.096 微功率电压和电流基准的典型应用
- 使用 ROHM Semiconductor 的 BD5323 的参考设计
- 模块化桌面时钟(M.2核心板、PCI-E 1x扩展板)
- 使用 Diodes Incorporated 的 PT8A 3517D 的参考设计
- 有奖直播:英飞凌针对电动工具的高功率、高效率以及高可靠性解决方案
- 调查:量身定制你的 M0 单片机!参与问卷有好礼!
- 劳动节归来,EEWORLD社区4月明星人物出台喽!
- ADI有奖下载活动之24:ADI公司医疗X射线成像解决方案
- 6月6日 Microchip 直播|利用单片机设计安全关键型应用时应采取的最佳实践方法
- 有奖活动 | 来PI PowiGaN技术学习中心,解密高可靠性和耐用性氮化镓(GaN)技术
- 非凡富士通FRAM,仅需微小电源即可高速写入数据!看视频答题有礼!
- ST直播主题:高度灵活的、易用的、可定制化的协议栈--BlueNRG-LP 协议栈介绍
- 得捷第二季Follow me第2期来袭,一起解锁功能强大且灵活的【Arduino UNO R4 WiFi】