【问题标题】:How to identify the RAM address space in windows operating system?windows操作系统如何识别RAM地址空间?
【发布时间】:2013-11-23 02:18:45
【问题描述】:

如果我创建一个变量说:

int a[10];

我正在创建一个变量并使用上述变量的地址空间来存储值。那么如何识别上述变量的地址空间呢??

【问题讨论】:

  • 你要的是可变地址吗?如果是 - 第一个元素的地址只是 a,其他元素的地址只是 &a[index]。但是,如果你使用这个地址,你如何“询问”这个地址会产生影响,以及如何在这里给你简单的答案。
  • @Artur : 如何识别windows操作系统中的RAM地址空间??
  • @sachin s:“Windows 操作系统中的 RAM 地址空间”是什么意思?如果你需要实际地址 - 你不会得到它。无论如何,这些都是虚拟地址。
  • 锄头在 RAM 中获取上述变量的固定地址??
  • 如果你想知道内存中的物理位置,你只能在内核模式下进行。你为什么要那个?

标签: c windows operating-system ram memory-address


【解决方案1】:

数组的内存地址范围从a[0]地址到a[9]地址。您可以使用&a[0]获取起始地址。

Address space 是指不同硬件组件(如 RAM、io 设备等)的地址范围。

【讨论】:

  • 锄头在 RAM 中获取上述变量的固定地址??
  • 固定地址是什么意思?每次运行程序时,都会为您分配不同的内存区域。变量的地址不固定;它们随着每个新实例而变化。此外,您无法获得绝对地址;只有虚拟地址。
  • 为什么我无法获取绝对地址??
  • 如果我初始化为 int a[10];那么如何获取RAM空间中变量a的地址??后来我使用相同的地址空间来存储值
  • 可以使用'&'操作符获取内存地址。您无法决定存储对象的内存地址;它是由操作系统在运行时决定的。
【解决方案2】:

如果要打印变量的地址

int a[10];
int i;
int *p = &i;
printf("Address of a : %p \n", (void *)a);
printf("Address of i : %p \n", (void *)&i);

//to update i using pointer do
*p = 100; //or even p[0] = 100;


//a is array which is actually a pointer so you can update its elements as
a[0] = 10; //for 1st elem
a[1] = 100; //for 2nd elem etc.
//you can do this too
p = a;
p[0] = 10;
p[1] = 100;

如果你想获得实际的物理地址,它并不容易获得。

【讨论】:

  • 是的,但有演员表,printf("Address of a : %p \n", (void *)a);
  • 锄头在 RAM 中获取上述变量的固定地址??
  • @sachins,固定地址是什么意思?
  • 如果我初始化为 int a[10];那么如何获取RAM空间中变量a的地址?后来我使用相同的地址空间来存储值。
  • @sachin:你必须努力澄清你的问题。它们非常奇怪,因此 SO 用户无法得到您所询问的内容 - 每个人都在猜测。请至少阅读ANSI C(英文不是翻译)。这应该可以帮助您使用适当的术语等写出更好的问题。
【解决方案3】:

Sachin - 如果您正在为没有虚拟内存的嵌入式系统编写代码,您可以写出字面上的物理地址位置。例如,如果您想编写一些 8 位长且地址为 0x123 的内存映射寄存器等,您可以这样做:

*((unsigned char*)0x123) = 45;

它将值 45(十进制)写入物理地址 0x123。

含义:

 *((unsigned char*)0x123)

如下:

(unsigned char*)0x123 // cast value 0x123 to pointer to unsigned char

这意味着将 0x123 视为无符号 8 位值的地址

还有全部内容:

*((unsigned char*)0x123) = 45;

将使用通过 (unsigned char*)0x123 获取的指针将值 45 写入地址 0x123。

一般情况下(在嵌入式系统上):

// assuming:
//  C - pointer to 8bit entity
//  S - pointer to 16bit entity
//  I - pointer to 32bit entity
*(C) = 8bit_val;   // will write 8bit **value** to physical address pointed by C
*(S) = 16bit_val;  // will write 16bit **value** to physical address pointed by S
*(I) = 32bit_val;  // will write 32bit **value** to physical address pointed by I

这真的很简单,但这会做你想做的事。 如果您想将数组、结构或常规变量放在特定的物理地址,可以在嵌入式系统上完成(例如,您必须阅读有关 ARM 编译器上的分散加载)。 Scater 文件将允许您将 a 数组放置在您想要的任何位置,并且您可以使用常规语法访问它,而无需显式使用指针。

但是在 Windows 平台上,您将无法做到这一点,因为您使用的不是物理地址,而是所谓的虚拟内存,其中您有一些理论上是地址但与物理地址无关的值。它太宽泛了,无法解释。这是一个巨大的主题。

这里有一些关于scatter loading的信息

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 2015-07-27
    • 2015-03-23
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多