是否可以使用C编程访问物理内存地址?

时间:2019-01-23 09:34:34

标签: c operating-system

例如,当我们写:
int a;
而做&a会给我们一些十六进制形式的地址0x12345678,我们称其为虚拟地址。
现在,当我们尝试做
int *temp = 0xfe000000;
该地址的作用类似于虚拟地址还是物理地址?据我所知,虚拟地址是由OS提供的,然后由MMU进一步转换为物理地址。

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

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


这个地址(0xfe000000)的作用类似于真实的物理地址还是虚拟的地址?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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