0

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

更具体地说,如何使用特定地址的示例在这里:指向特定固定地址的指针,但没有关于为什么这是读/写的有效地址的信息。

我想要一种找出可用地址x的方法。y

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

请具体回答 Ubuntu。

4

3 回答 3

4

您可以使用malloc()返回的任何内存地址。此外,您可以指定需要多少内存。和你在一起realloc()之后,你甚至可以改变主意。

于 2013-02-04T13:20:16.293 回答
3

您在这里混合了两个独立的主题。您要链接到的问题是关于微控制器的内存映射 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);

静态变量可以通过这种方式在模拟中使用,因此您不必担心写入哪些地址是“安全的”。

于 2013-02-04T13:17:38.810 回答
1

对于引用的 ATMega128 微控制器,您可以在数据表中查看哪些地址映射到寄存器。在安装了操作系统的 PC 上,您将无法通过这种方式直接访问硬件寄存器。至少不是来自用户空间。通常只允许设备驱动程序(环 0)访问硬件。

正如其他人已经提到的那样,您必须使用例如malloc()告诉操作系统您需要一个指向允许您写入的内存卡盘的指针。这是因为操作系统管理整个系统的内存。

于 2013-02-04T13:40:36.737 回答