函数指针:物理或虚拟地址

Posted

技术标签:

【中文标题】函数指针:物理或虚拟地址【英文标题】:function pointer :physical or virtual address 【发布时间】:2009-08-24 18:24:50 【问题描述】:

当我们得到一个函数或任何对象的地址时,它是该对象的虚拟地址还是物理地址??

【问题讨论】:

【参考方案1】:

您是在问一般的指针吗?

在大多数操作系统上,它们是逻辑地址。

操作系统负责通过虚拟内存和分页机制将它们转换为物理地址。这对程序是透明的。这就是为什么一个被误导的程序会“突破界限”和 GPF。

在某些旧系统(例如 DOS)上,它们将是物理的,允许您覆盖内存其他部分的内容。

【讨论】:

【参考方案2】:

取决于操作系统以及您的代码在哪个级别运行。

对于现代操作系统上的普通用户级程序,您将获得虚拟地址。

【讨论】:

但如果我运行以下程序:int main() int (*p)(); p=main;printf("%p",p); 它给出的地址是0x80483c4,它认为是物理地址,为什么main的虚拟地址会从这么大的地址开始?我在 linux.plz 上运行这个如果我错了吗?? 你错了。那是一个虚拟地址。没有人说你的 main() 函数是在虚拟地址 0 加载的。事实上,默认情况下,在 ELF 二进制文件(在 linux 中使用)中,代码段从虚拟地址 0x80482c0 开始,看起来差不多正确(有一些隐藏的设置main()) 之前的代码。请记住,虚拟地址空间通常是不连续的,并且仅在您使用它们时才分配虚拟地址。仅仅因为您的程序在 0x80482c0 加载并不意味着那里和 0x0 之间的所有内容都已分配。 如果您真的有兴趣了解 Linux 下程序在内存中的组织方式,请阅读:linuxforums.org/articles/… 上一条评论有链接。您需要了解的是:所有非内核程序仅处理虚拟地址,以及(如果您想更详细地了解)ELF 格式如何组织您的虚拟地址空间(上一个链接)。如果您一般不清楚虚拟内存,***对它有很好的处理:en.wikipedia.org/wiki/Virtual_memory。请特别注意,在实际使用之前,虚拟地址不一定对应于任何物理地址。 即使你的程序是在地址 0 加载的,也不一定意味着 main() 最终会在地址 0 处(或特别接近)。允许链接器安排函数和其他在它认为合适的任何地址链接到可执行文件的对象(通常)。

以上是关于函数指针:物理或虚拟地址的主要内容,如果未能解决你的问题,请参考以下文章

linux 不同进程间能否传递指针?(不能,虚拟地址进程私有,被不同进程映射到物理地址不同)

虚拟内存或物理内存

虚拟内存和物理内存(转)

内核物理地址和虚拟地址之间的静态映射过程

虚拟地址与物理地址的映射

GDB调用堆栈地址虚拟还是物理?