2010-10-18 750 views
3

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

编辑:

我读的地方“在一些实现,调用free()释放内存给系统,而在其他被释放回过程”。 “释放回系统”意味着内存是实际的物理内存,“释放回到进程”意味着它是虚拟内存?

+3

你希望答案能为你带来什么?它真的取决于大量的参数,如架构,操作系统等...你能提供更多的信息吗? – fbrereto 2010-10-18 05:24:47

+0

到你的编辑:没有。释放回系统意味着内存可以被OS提供给另一个进程。释放回到进程意味着内存可以在未来的调用中返回到'malloc',而不是在另一个进程中。例如,释放的块可能被添加到每个进程的可用块列表中。这与虚拟内存没有任何关系。通常这是因为进程以大块的形式从操作系统获取内存,然后将其拆分成malloc中的小块。它不能释放到操作系统,除非它知道整个块未被使用。 – 2010-10-18 10:28:50

回答

14

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

3

还有没有在C标准中的真实或虚拟记忆的概念,所以这个问题是没有意义的。无论如何,它的实现都是免费的。

在虚拟内存操作系统中,您几乎可以肯定会得到一个虚拟地址。在非虚拟内存的操作系统中,你可能不会。

在这两种情况下你将得到的是一个地址,你可以使用它为C提供地址的所有常见事物,例如解引用,释放,重新分配等等。 是您唯一的保证,也是您通常需要关注的唯一事情。

如果愿意,您可以免费给您一个顺序ID列表(1,2,3,...),前提是所有预期的操作仍然按照所宣传的方式工作。当然,这在目前的体系结构中可能效率不高,但它仍然可行。

+0

我看不出你如何在顺序标识符上执行任何合理的算术来访问已分配块中的不同字节...... ;-)也许在高32位中的顺序标识符和在低32位中的偏移量? – 2010-10-18 05:33:58

+0

我没有说这是合理的,只是可能的:-)如果为索引生成的代码('x []'和'*(x + n)')和比较(以及其他可能的事情)已经足够复杂处理序列性质,它可能是可行的。我当然不想开发或使用这样的系统,但根据标准,这并不会降低可能性。例如,将内存ID向上移动32位(如您所建议的)可以在生成的代码中自动执行。我的观点是你只应该制定标准规定的假设。 – paxdiablo 2010-10-18 05:42:01

0

我可以想到,你会关心一个物理内存地址的唯一原因是,如果你想直接与某个内存映射硬件对话...在这种情况下,你需要更多东西比malloc()低。您必须使用内核或驱动程序界面,或者禁止使用内核或驱动程序界面,使用类似UNIX的/dev/mem之类的操作系统后台 - 或者,最好自己编写驱动程序,将所需的物理内存映射到应用程序的虚拟内存中。