" arm64 / kernel / asm-offsets.c&#34 ;?的目的是什么?

时间:2015-09-25 07:59:28

标签: c linux-kernel kvm arm64

我正在尝试查看" arch / arm64 / kernel / asm-offsets.c"中定义的内容。

但是不了解这个文件的目的,它实际包含什么?

例如:

DEFINE(KVM_TIMER_CNTVOFF,     offsetof(struct kvm, arch.timer.cntvoff));

上面的定义是什么意思,arch.timer.cntvoff映射到实际映射的实际CNTVOFF_EL2寄存器?

1 个答案:

答案 0 :(得分:2)

此文件包含以汇编程序编写的模块所需的定义,例如,在KVM_TIMER_CNTVOFF的情况下,它生成一个具有相同名称的符号,该符号包含从{1}开始的arch.timer.cntvoff字段的偏移量。 kvm结构(使用offsetof宏:http://lxr.free-electrons.com/source/tools/include/linux/kernel.h#L15)。

所以,如果你有这个,你可以使用这些符号来访问asm中的结构字段,如下所示:http://tomoyo.osdn.jp/cgi-bin/lxr/source/arch/arm/kvm/interrupts_head.S#L555

555         ldr     r4, [vcpu, #VCPU_KVM]
556         ldr     r2, [r4, #KVM_TIMER_ENABLED]
557         cmp     r2, #0
558         beq     1f
559 
560         ldr     r2, [r4, #KVM_TIMER_CNTVOFF]
561         ldr     r3, [r4, #(KVM_TIMER_CNTVOFF + 4)]
562         mcrr    p15, 4, rr_lo_hi(r2, r3), c14   @ CNTVOFF
563 

因此,在r4中,您拥有struct kvm实例的地址和

ldr     r2, [r4, #KVM_TIMER_CNTVOFF]

您正在访问字段KVM_TIMER_CNTVOFF