malloc/calloc从虚拟地址空间返回的内存地址是?

kin*_*er1 7 c linux malloc

char *ptr = (char*) malloc(40);
printf("%u",ptr);

56737856 (some output)
Run Code Online (Sandbox Code Playgroud)

现在,如果我不正确,我们上面看到的输出不是物理地址,而是来自虚拟地址空间.我对么?

有没有办法看到实际的实际地址?反之亦然(如果我的上述假设是错误的),并且malloc的所有内部实现都必须使用jemalloc算法吗?

dus*_*uff 11

您在用户空间应用程序中看到的所有地址都是虚拟地址

物理地址仅与内核有关.从虚拟地址到物理地址的映射很复杂,因为:

  • 并非所有虚拟地址都具有物理地址.(例如,未映射,懒惰零填充或换出的页面没有物理地址.)
  • 物理地址可能会在没有警告的情况下发生变化(例如,如果页面被换出并重新进入,或者如果复制了共享页面).

在一些非常不寻常的情况之外(主要是与硬件混乱),你不应该关心物理地址.