malloc函数的返回值是虚拟地址还是物理地址?

3

malloc返回的地址是虚拟地址还是实际分配内存的物理地址?

编辑:

我在某处读到过:“在某些实现中,调用free()将内存释放回系统,而在其他情况下,它将被释放回进程。”“释放回系统”是否意味着该内存是实际的物理内存,“释放回进程”是否意味着它是虚拟内存?


3
您希望这个答案能为您带来什么?这实际上取决于一系列参数,例如架构、操作系统等等...您能提供更多信息吗? - fbrereto
关于您的编辑:不行。释放回系统意味着操作系统可以将内存提供给另一个进程使用。释放回进程意味着该内存可以在此进程中的将来调用malloc时返回,但不能在另一个进程中返回。例如,已释放的块可能会添加到可用块的每个进程列表中。这与虚拟内存无关。通常是因为进程从操作系统中获取大块内存,然后在malloc中将其分成小块。除非它知道整个块未使用,否则它无法释放给操作系统。 - Steve Jessop
3个回答

14

这是一种在当前进程中有效的地址。它是虚拟地址还是物理地址取决于底层平台。


3
在C标准中,没有真实或虚拟内存的概念,因此这个问题是没有意义的。实现可以随意进行处理。
在虚拟内存操作系统中,你几乎肯定会得到一个虚拟地址。在非虚拟内存操作系统中,你可能不会得到。
在两种情况下,你都会得到一个地址,你可以用它来进行C提供的所有通常地址的事情,如解引用、释放、重新分配等等。这就是你唯一的保证,也是你通常需要关注的唯一事情。
如果愿意,它可以向你提供顺序ID列表(1、2、3……),只要所有预期的操作仍然按照广告所述工作即可。尽管在当前架构中可能效率不高,但仍然可行。

我无法理解如何对顺序ID执行任何合理的算术运算,以访问分配块中的不同字节..;-)也许在高32位中使用顺序ID和在低32位中使用偏移量? - R.. GitHub STOP HELPING ICE
我并没有说这种做法是合理的,只是可能可行 :-) 如果用于索引 (x[]*(x+n)) 和比较(以及其他可能的操作)的代码足够复杂以处理顺序性,那么它就可以变得可行。我肯定不想开发或使用这样的系统,但这并不意味着根据标准,它就不可能实现。例如,将内存ID上移32位(正如您所提出的)可以在生成的代码中自动完成。我的观点是,您应该仅对标准指定的内容进行假设。 - paxdiablo

0
我能想到你关心一个物理内存地址的唯一原因是,如果你试图直接与一些内存映射硬件通信...在这种情况下,你需要比malloc()更底层的东西。你必须使用内核或驱动程序接口,或者在没有这些接口的情况下,绕过操作系统,使用类似UNIX的/dev/mem--或者更好的是,编写一个驱动程序将所需的物理内存映射到应用程序的虚拟内存中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接