哪些内存地址可供使用?

时间:2013-02-04 13:04:22

标签: c memory ubuntu

如何找出适合使用的内存地址?

更具体地说,如何使用特定地址的示例在这里:Pointer to a specific fixed address,但没有关于为什么的信息这是一个有效的阅读地址/写作。

我想找到一种方法可以找到xy的地址是可用的。

这样我就可以在没有特定模拟器的情况下执行类似于内存映射IO的操作。 (我的链接问题相关,所以我可以使用一组地址在Ubuntu上进行测试,另一组用于实际的片上软件)

请Ubuntu具体回答。

3 个答案:

答案 0 :(得分:4)

您可以使用任何内存地址malloc()返回。此外,您可以指定所需的内存量。使用realloc(),您甚至可以改变主意。

答案 1 :(得分:3)

你在这里混合了两个独立的主题。您要链接的Question是关于微控制器的内存映射IO。它指的是来自Atmel的微控制器ATM128。该问题的OP试图写入其中一个寄存器,这些寄存器被赋予特定的地址。

如果您正在尝试写入寄存器的地址,您需要了解内存映射IO的工作原理,您需要阅读您正在处理的芯片组/ IC的规范。问这个谈论“Ubuntu具体答案”是没有意义的。

在Ubuntu OS上运行的程序正在运行它自己的虚拟地址空间。因此,询问地址xy是否可供使用是非常没有意义的...除非您正在访问硬件,否则找到特定地址是没有意义的,只需使用操作系统为您提供的内容即可你会知道你很好。


根据您的编辑,您正在尝试模拟内存映射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管理整个系统的内存。