arm版linuxamd64 arm64

问题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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注