Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 为什么u-boot可以放置全局数据';s地址进入r9寄存器?_Gcc_Arm_U Boot_Cortex A8 - Fatal编程技术网

Gcc 为什么u-boot可以放置全局数据';s地址进入r9寄存器?

Gcc 为什么u-boot可以放置全局数据';s地址进入r9寄存器?,gcc,arm,u-boot,cortex-a8,Gcc,Arm,U Boot,Cortex A8,当我查看u-boot源代码时,我发现它通过r9寄存器传递全局数据,如下所示 register volatile gd_t *gd asm ("r9") 所以,我很好奇,u-boot如何确保进一步的代码不会使用r9寄存器并损坏全局数据。有没有一个选项可以告诉编译器不要使用特定的寄存器?嗯,有-ffix reg。但是,如果编译所有代码时都将此变量声明为全局变量,则它将永远不会用于任何其他目的(请参阅) 寄存器r9的作用是特定于平台的。虚拟平台可以为此注册表分配任何角色,并且必须记录此用法。例如,它

当我查看u-boot源代码时,我发现它通过r9寄存器传递全局数据,如下所示

register volatile gd_t *gd asm ("r9")

所以,我很好奇,u-boot如何确保进一步的代码不会使用r9寄存器并损坏全局数据。有没有一个选项可以告诉编译器不要使用特定的寄存器?

嗯,有-ffix reg。但是,如果编译所有代码时都将此变量声明为全局变量,则它将永远不会用于任何其他目的(请参阅)

寄存器r9的作用是特定于平台的。虚拟平台可以为此注册表分配任何角色,并且必须记录此用法。例如,它可以在独立于位置的数据模型中将其指定为静态基址(SB),也可以在具有线程本地存储的环境中将其指定为线程寄存器(TR)。使用此寄存器可能需要在所有调用中保持持久值。不需要这种特殊寄存器的虚拟平台可以将r9指定为另一个被调用方保存的变量寄存器v6


但是对于平台使用。

还值得注意的是,它过去是r8,现在仍然存在于一些供应商分支中:在“register volatile gd_t*gd asm(“r9”)中使用“volatile”类型限定符有什么具体原因吗?内存将分配给全局数据结构,并将地址存储在gd指针(寄存器r9)中。因此,不会异步更改内存地址,提供的gcc链接还表示“不要使用诸如const和volatile之类的类型限定符”。@user3693586-我不确定我是您应该询问的人,因为我不建议使用
volatile
。也就是说,这可能会有所帮助。轻微地在某些情况下。但是,既然你不能依赖它(正如你所指出的:文档非常清楚),那么添加它是一个坏主意。人们可能会有他们所依赖的期望。如果你的代码不稳定就不能工作,那么你的代码就不能工作,你需要做些别的事情。谢谢你的回复。关于宏
DECLARE\u GLOBAL\u DATA\u PTR
的用法,我有一个疑问,它声明了
gd
类型的
gd\u t
变量。这个宏用于多个文件,意味着
gd
变量在多个文件中声明,但编译时我们仍然没有得到
gd
变量的
多个声明
错误。从U-boot源代码中,此宏用于
common/cli.c、common/cli\U readline.c、common/env\U common.c、common/board\U r.c以及在生成时编译的所有这些文件。“此宏用于多个文件”-是否同时使用所有这些文件?如果一个是ARM,一个是MIPS,一个是x86,就不会有冲突,因为它们不会被编译成相同的输出。宏用于多个文件,并已编译。我指的是v2017.3[源代码。其中一组文件是
common/main.c
common/exports.c
。在
common/Makefile
中,这两个文件都被选择为
obj-y+=main.o,obj-y+=exports.o
,这意味着它们是编译的,并且是
内置.o
的一部分。另一组文件是
common/board\f.c
common/bo>ard_f.c