如何找出适合使用的内存地址?
更具体地说,如何使用特定地址的示例在这里:Pointer to a specific fixed address,但没有关于为什么的信息这是一个有效的阅读地址/写作。
我想找到一种方法可以找到x
到y
的地址是可用的。
这样我就可以在没有特定模拟器的情况下执行类似于内存映射IO的操作。 (我的链接问题相关,所以我可以使用一组地址在Ubuntu上进行测试,另一组用于实际的片上软件)
请Ubuntu具体回答。
答案 0 :(得分:4)
您可以使用任何内存地址malloc()
返回。此外,您可以指定所需的内存量。使用realloc()
,您甚至可以改变主意。
答案 1 :(得分:3)
你在这里混合了两个独立的主题。您要链接的Question是关于微控制器的内存映射IO。它指的是来自Atmel的微控制器ATM128。该问题的OP试图写入其中一个寄存器,这些寄存器被赋予特定的地址。
如果您正在尝试写入寄存器的地址,您需要了解内存映射IO的工作原理,您需要阅读您正在处理的芯片组/ IC的规范。问这个谈论“Ubuntu具体答案”是没有意义的。
在Ubuntu OS上运行的程序正在运行它自己的虚拟地址空间。因此,询问地址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);
静态变量可以通过这种方式用于模拟,因此您无需担心要写入的“安全”地址。
答案 2 :(得分:1)
对于引用的ATMega128微控制器,您可以查看Datasheet以查看哪些地址映射到寄存器。在安装了OS的PC上,您将无法直接以这种方式访问硬件寄存器。至少不是来自用户空间。通常只允许设备驱动程序(振铃0)访问硬件。
正如其他人已经提到的,你必须使用例如malloc()
告诉操作系统你需要一个指向你可以写入的内存卡盘的指针。这是因为OS管理整个系统的内存。