【问题标题】:Is it possible to access a physical memory address using C programming?是否可以使用 C 编程访问物理内存地址?
【发布时间】:2019-06-16 20:32:19
【问题描述】:

例如,当我们写:
int a;
并且做&a给我们一些十六进制形式的地址0x12345678,我们称之为虚拟地址。
现在当我们尝试做
int *temp = 0xfe000000;
这个地址是像虚拟地址还是物理地址?据我所知,虚拟地址由操作系统提供,然后由 MMU 进一步转换为物理地址。

据我所知,分页机制发生在将虚拟地址映射到可用物理地址之间。当我们给指针一个地址时会发生什么?该地址是像虚拟地址一样,然后由 MMU 处理以指向特定的物理地址,还是它本身就像一个物理地址?

int temp;
printf("%x \n", &temp);
int *temp2 = 0xfe000000; //This is just an example address. It could be any address


这个地址(0xfe000000)是像真实物理地址还是虚拟地址?

【问题讨论】:

  • 取决于平台。在现代操作系统上,所有地址都是虚拟的,您无法从普通用户模式程序中寻址物理地址,只能从驱动程序中寻址,但这是另一回事。另一方面,在简单的微控制器上,您只能访问物理地址,因为没有虚拟内存。
  • 简短回答:虚拟。

标签: c operating-system


【解决方案1】:

如果您使用的是操作系统,那么这是不可能的,因为操作系统正在使用虚拟地址,并且您使用的任何内容都将通过虚拟地址映射到物理地址。

但是,如果您正在对微控制器进行编程,则没有虚拟地址,您可以使用 C 中的指针访问物理内存位置。

【讨论】:

    【解决方案2】:

    我们通常得到的地址,比如PC中C编程中的一个指针是虚拟地址。虚拟到物理的映射以及反之亦然,由操作系统在内部处理。通常,用户(root 或其他用户)在地址映射中没有发言权。

    另一方面,简单的微控制器通常没有TLB映射,因此您访问的地址是设备的实际物理地址,如其他答案所述。

    此外,如果您打算从头开始使用微处理器,您始终可以拥有自己的物理到虚拟地址映射,甚至可以为地址块设置属性。

    【讨论】:

      猜你喜欢
      • 2014-12-31
      • 2021-10-28
      • 2012-10-27
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      相关资源
      最近更新 更多