如何在物理内存中指定变量位置?

时间:2011-04-04 15:36:38

标签: c gcc elf

gcc允许使用section属性控制放置变量的部分:

struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };

有没有办法在我的C代码中在物理内存中指定此部分的确切位置?我假设没有虚拟内存,或者,虚拟地址直接转换为物理地址。

我知道我可以通过传递给链接器的脚本来处理它,但如果我可以直接在我的(自动生成的)C中指定它,那会更好。

2 个答案:

答案 0 :(得分:1)

您可以通过使用宏来实现在某个物理地址处使用变量的效果,例如:

#define a (*(volatile struct duart *)0xdeadbeef)

这不使用链接器;它不会声明任何变量,因此您不会在目标文件中看到a。但我想你不需要这个。

注意volatile关键字,使用内存映射硬件时总是需要它。它经常在没有volatile的情况下工作,但有时它不会,并且调试这样的失败很难 - 所以不要忘记volatile关键字!

用法:

// I assume the duart structure has fields write_buf and read_buf of type uint8_t
a.write_buf = 0x55; // write data to DUART
a.write_buf = 0xaa; // write more data to DUART
uint8_t byte1 = a.read_buf; // read data from DUART
uint8_t byte2 = a.read_buf; // read more data from DUART

答案 1 :(得分:0)

一种简单的方法是定义指向结构的指针并使用正确的值初始化它,因此您不需要特殊的链接器选项。当然,只有当您不需要任何speciel链接时功能时,该技巧才有效。

再见!