【问题标题】:What's purpose of "arm64/kernel/asm-offsets.c"?“arm64/kernel/asm-offsets.c”的目的是什么?
【发布时间】:2015-09-25 07:59:27
【问题描述】:

我正在尝试研究“arch/arm64/kernel/asm-offsets.c”中定义的内容。

但不明白这个文件的用途,它实际上包含什么?

例如:

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

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

【问题讨论】:

    标签: c linux-kernel kvm arm64


    【解决方案1】:

    此文件包含用汇编程序编写的模块所需的定义,例如在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

    【讨论】:

    • 感谢@Nemanja 的回答,抱歉不能早点欣赏它。如果我必须定义新变量(与 KVM_TIMER_CNTVOFF 相同)并稍后在 ASM 块中引用它,我还想要一件事?
    • 不客气。如果我理解您的要求:那么,如果您想向 struct 添加新字段并从 asm 访问它,您应该将新的 DEFINE 添加到 asm-offsets.c 中。我不确定从头到尾,但是构建中应该有一些东西会生成.s文件,其中包含该文件中的符号,您将用于 asm 步骤。
    • 好的,我知道我需要在 asm-offsets.c 中添加新的 DEFINE 但是#define KVM_TIMER_CNTVOFF 1000,我会为新变量定义这个数字 1000 吗?也可以定义一个可以在 ASM 块中引用的变量(不是结构成员)吗?
    • (注意不是#define,而是DEFINE)。不,您只能将其用于偏移量,而不能用于变量。对于访问变量,我假设 IMPORT=globvar 应该可以解决问题。见infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0040d/…
    • 它仍在使用偏移量。因此,您将字段的偏移量存储在 r4 (ldr r4, =VCPU_TIMER_CNTV_CVAL) 中,然后将其添加到结构的开头并将结果存储在 r5 (add r5, vcpu, r4) 中,然后您将在 r5 中获得该字段的地址。然后,如果有意义,我们将 r2、r3 双字存储到带有strd r2, r3, [r5] 的字段中?
    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 2016-04-22
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2021-09-13
    相关资源
    最近更新 更多