10
当我们得到某个函数或任何对象的地址时,它是该对象的虚拟地址还是物理地址?函数指针:物理地址或虚拟地址
当我们得到某个函数或任何对象的地址时,它是该对象的虚拟地址还是物理地址?函数指针:物理地址或虚拟地址
你问一般指针吗?
在大多数操作系统上,它们都是逻辑地址。
操作系统负责通过虚拟内存和分页机制将它们转换为物理地址。这对程序是透明的。这就是为什么一个误导性的节目“碰到边界”和GPF。
在一些旧系统(例如DOS)上,它们将是物理的,允许您覆盖内存其他部分的内容。
取决于操作系统和代码运行的级别。
对于现代操作系统上的普通用户程序,您将获得虚拟地址。
但如果我运行以下程序:int main(){int(* p)(); p = main; printf(“%p”,p);} 它给的地址如0x80483c4,它认为它是物理地址,为什么主要的虚拟地址会在这么大的地址启动? 我在linux.plz上运行这个澄清如果我错了?? – mawia 2009-08-24 18:35:21
你错了。这是一个虚拟地址。没有人说你的main()函数是在虚拟地址0加载的。实际上,在ELF二进制文件(在linux中使用)中默认情况下,代码段从虚拟地址0x80482c0开始,这看起来是正确的(有一些隐藏的设置main()之前的代码)。请记住,虚拟地址空间通常是非连续的,虚拟地址只在您使用时分配。仅仅因为你的程序在0x80482c0加载并不意味着在那里和0x0之间的所有内容都已经被分配了。 – 2009-08-24 18:41:41
如果你真的有兴趣了解你的程序在Linux下如何在内存中组织,请阅读以下内容:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html – 2009-08-24 18:42:17