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

标签 c gcc elf

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

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

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

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

最佳答案

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

#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

关于c - 如何在物理内存中指定变量位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5540863/

相关文章:

c - 对于分配内存的函数,您遵循什么命名约定?

c - 无符号整数的舍入除法,无溢出

c++ - 使用 makefile 构建时 GCC 不使用的预编译 header

c++ - 是首先调用 init 部分函数还是构造函数?

c - ELF 文件格式中的 sh_addr 总是等于 sh_offset 吗?

compiler-construction - ELF文件中的“节到段映射”存储在哪里?

c - 我应该在这个库中使用 volatile 吗(以及在哪里)?

c - 查找除数为奇数的数字的程序

gcc - 如何在没有优化的情况下将 gcov 与 gcc 一起使用?

linux - 微小的 "manually"创建的 ELF 给出了段错误