【问题标题】:How is the code memory managed?如何管理代码内存?
【发布时间】:2011-03-13 18:18:14
【问题描述】:

在谈到进程的内存时,我听说过诸如代码内存数据内存之类的东西。

对于数据内存,有两种主要的管理机制,栈和堆。

我现在想知道 代码内存 是如何管理的?谁来管理它?

如果我的陈述不是很清楚,请原谅我。

谢谢。

【问题讨论】:

    标签: c++ c operating-system


    【解决方案1】:

    如果您有兴趣了解有关进程内存管理的详细信息,我推荐http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory(以及其他与内存相关的文章)。

    代码内存 = 文本段

    注意地址空间是 4GB。当内核创建一个进程时,它会给它虚拟内存。下面是一个 32 位操作系统的示例。内核通过处理器的MMU 管理映射到实际 RAM 的地址。因此,内核和 MMU 管理代码内存,就像它们管理进程的整个地址空间一样。


    (来源:duartes.org

    【讨论】:

    • 布局通常由链接器而不是内核设置(和管理)。内核只是读取可执行映像中的信息并相应地设置内存映射。如果可执行文件如此指定(这适用于动态链接的可执行文件)并处理很多事情,则动态链接器将被映射。您可能会认为链接器是操作系统的“一部分”,但您可以创建一个自定义链接器来执行您想要的任何操作,
    • 请特别注意,该图形并不代表 Windows 中应用程序的默认状态。在 Windows 中,内核默认占用 2 GB 的空间,而应用程序则拥有 2 GB 的用户模式内存。所以这张图做了很多假设。要获得 3 GB 的用户模式,您必须设置“3 GB 开关”,并且您必须将您的应用程序与 LARGEADDRESSAWARE 开关链接。我只是把这些名字从我的记忆中拉出来,所以你必须用谷歌搜索这些术语以获得更多细节。关于此图形的另一个假设是您使用的是 32 位操作系统。
    【解决方案2】:

    代码内存不需要管理,因为它不会改变。当可执行文件被加载到地址空间时,代码只是从可执行文件读取到内存中。事实上,在现代操作系统上,代码段只是映射到可执行文件的内存。

    【讨论】:

    • 好吧,好吧....这取决于操作系统。正如我从 A. Silberschatz 关于操作系统的书中所记得的那样,一些架构可能能够移动代码,但它必须对程序员透明。加载/卸载动态库还涉及代码的一些内存管理。
    • @doc:是的,但它因操作系统和架构而异。我上面所说的主要是基于对 OS X 可执行文件格式的探讨。
    【解决方案3】:

    由操作系统管理。当程序运行时,它的代码从可执行文件加载到某个内存地址。根据程序的性质,对代码部分进行了一些更改,例如解析到动态链接库的跳转。

    根据 Space_C0wb0y 的建议,请查看 en.wikipedia.org/wiki/Dynamic_linker 了解正在发生的事情的详细信息。

    【讨论】:

    【解决方案4】:

    您的操作系统提供了所谓的系统调用来动态分配内存(malloc、free 等),它还提供了加载和执行程序的机制。

    当操作系统加载程序时,文本段(代码内存)被设置并且程序中静态分配的内存立即可用。当您的代码调用函数时,函数中的(静态分配的)变量在堆栈上分配,而动态分配的内存(例如使用 malloc())在堆上分配。在您的程序运行期间,管理内存是您(程序员)的责任(不这样做会导致内存泄漏,最终会导致长时间运行的程序耗尽内存并崩溃,或者在极端情况下)情况下,取决于操作系统,请使用它来关闭整个操作系统)。

    另见这篇文章:http://www.maxi-pedia.com/what+is+heap+and+stack

    【讨论】:

    • 在大多数操作系统上,堆不是由内核管理的。它通常是驻留在某种运行时库(例如 ntdll、libc)中的纯用户模式组件,然后对较低级别的页面处理函数(例如 NtAllocateVirtualMemory)进行系统调用。
    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多