1

我正在为我的树莓派编写一个玩具操作系统,并使用xv6作为参考。

当我尝试加载在另一个文件(在 C 中)中定义的“entrypgdir”符号时,我的代码出现编译错误。

_start.S:

#include "mem.h"

.globl entry
entry:
    mov r0, #(V2P_NOCAST(entrypgdir))

V2P_NOCAST 是一个在 .h 文件中定义为的简单宏

内存.h:

#define V2P_NOCAST(va) ((va) - KERNBASE)

和错误:

$ arm-none-eabi-gcc -c -o build/_start.o source/_start.S
source/_start.S: Assembler messages:
source/_start.S:17: Error: undefined symbol entrypgdir used as an immediate value

我很好奇,因为 xv6 就是这样做的,

movl    $(V2P_WO(entrypgdir)), %eax

它编译得很好,

$ gcc -m32 -c -o entry.o entry.S

我的工具链有问题吗?还是在ARM中不可能?

4

1 回答 1

2

试试这个

entry:
    ldr r0, =(V2P_NOCAST(entrypgdir))

指令中的中间值mov需要嵌入到指令中,因此需要在编译时知道以及地址使用,您不能通过 mov 加载任何 32 位值,这会迫使您退回到ldr.

于 2013-03-28T09:14:15.277 回答