"arm64/kernel/asm-offsets.c" 的目的是什么?
What's purpose of "arm64/kernel/asm-offsets.c"?
我正在尝试查看 "arch/arm64/kernel/asm-offsets.c" 中定义的内容。
但是不明白这个文件的用途,它到底包含什么?
例如:
DEFINE(KVM_TIMER_CNTVOFF, offsetof(struct kvm, arch.timer.cntvoff));
上面的定义是什么意思,是arch.timer.cntvoff映射到实际映射的实际CNTVOFF_EL2寄存器吗?
此文件包含用汇编程序编写的模块所需的定义,例如在 KVM_TIMER_CNTVOFF
的情况下,它生成一个具有相同名称的符号,其中包含 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
。
我正在尝试查看 "arch/arm64/kernel/asm-offsets.c" 中定义的内容。
但是不明白这个文件的用途,它到底包含什么?
例如:
DEFINE(KVM_TIMER_CNTVOFF, offsetof(struct kvm, arch.timer.cntvoff));
上面的定义是什么意思,是arch.timer.cntvoff映射到实际映射的实际CNTVOFF_EL2寄存器吗?
此文件包含用汇编程序编写的模块所需的定义,例如在 KVM_TIMER_CNTVOFF
的情况下,它生成一个具有相同名称的符号,其中包含 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
。