我如何找出适合使用的内存地址?
更具体地说,如何使用特定地址的示例在这里:指向特定固定地址的指针,但没有关于为什么这是读/写的有效地址的信息。
我想要一种找出可用地址x
的方法。y
这样我就可以在没有特定模拟器的情况下执行类似于内存映射 IO 的操作。(我的链接问题相关,因此我可以使用一组地址在 Ubuntu 上进行测试,另一组地址用于实际的片上软件)
请具体回答 Ubuntu。
我如何找出适合使用的内存地址?
更具体地说,如何使用特定地址的示例在这里:指向特定固定地址的指针,但没有关于为什么这是读/写的有效地址的信息。
我想要一种找出可用地址x
的方法。y
这样我就可以在没有特定模拟器的情况下执行类似于内存映射 IO 的操作。(我的链接问题相关,因此我可以使用一组地址在 Ubuntu 上进行测试,另一组地址用于实际的片上软件)
请具体回答 Ubuntu。
您可以使用malloc()
返回的任何内存地址。此外,您可以指定需要多少内存。和你在一起realloc()
之后,你甚至可以改变主意。
您在这里混合了两个独立的主题。您要链接到的问题是关于微控制器的内存映射 IO。它指的是ATM128,来自 Atmel 的微控制器。该问题的 OP 正在尝试写入其中一个寄存器,这些寄存器被赋予特定的地址。
如果您尝试写入寄存器的地址,您需要了解内存映射 IO 的工作原理,您需要阅读您正在使用的芯片组/IC 的规范。问这个谈论“Ubuntu特定答案”是没有意义的。
您在 Ubuntu 操作系统上运行的程序正在运行它自己的虚拟地址空间。因此,询问地址x
是否y
可供使用是毫无意义的……除非您正在访问硬件,否则寻找特定地址是没有意义的,只需使用操作系统为您提供的地址,您就会知道自己很好。
根据您的编辑,您正在尝试模拟内存映射 IO,您可以执行以下操作:
#ifdef SIMULATION
unsigned int TX_BUF_REG; // The "simulated" 32-bit register
#else
#define TX_BUF_REG 0x123456 // The actual address of the reg you're simulating
#endif
然后使用访问器宏通过掩码读取或写入特定位(通常这样做):
#define WRITE_REG_BITS(reg, bits) {reg |= bits;}
...
WRITE_REG_BITS(TX_BUF_REG, SOME_MASK);
静态变量可以通过这种方式在模拟中使用,因此您不必担心写入哪些地址是“安全的”。
对于引用的 ATMega128 微控制器,您可以在数据表中查看哪些地址映射到寄存器。在安装了操作系统的 PC 上,您将无法通过这种方式直接访问硬件寄存器。至少不是来自用户空间。通常只允许设备驱动程序(环 0)访问硬件。
正如其他人已经提到的那样,您必须使用例如malloc()
告诉操作系统您需要一个指向允许您写入的内存卡盘的指针。这是因为操作系统管理整个系统的内存。