Как управляется память кода?

Говоря о памяти процесса, я слышал о таких вещах, как память кода и память данных.

И для памяти данных существует 2 основных механизма управления, стек и куча.

Теперь мне интересно, как управляется память кода? И кто его управляет?

Простите меня, если мое выражение не так ясно.

Спасибо.

Ответы

Ответ 1

Я рекомендую http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory (и другие статьи, связанные с памятью), если вам интересно узнать больше о деталях процесса" управления памятью.

память кода = сегмент текста

Обратите внимание, как адресное пространство составляет 4 ГБ. Когда ядро ​​создает процесс, он дает ему виртуальную память. Ниже приведен пример 32-разрядной ОС. Ядро управляет тем, какие адреса сопоставляются с фактической ОЗУ с помощью процессора MMU. Таким образом, ядро ​​и MMU управляют памятью кода, так же как они управляют всем адресным пространством процесса.

Заимствован из duartes.org http://static.duartes.org/img/blogPosts/linuxFlexibleAddressSpaceLayout.png

Ответ 2

Кодовая память не нуждается в управлении, потому что она не изменяется. Когда исполняемый файл загружается в адресное пространство, код просто считывается из исполняемого файла в память. Фактически, в современных операционных системах сегмент кода представляет собой просто память, сопоставленную с исполняемым файлом.

Ответ 3

Он управляется операционной системой. Когда программа запускается, код загружается из исполняемого файла на некоторый адрес памяти. В зависимости от характера программы некоторые изменения применяются к разделам кода, например. переходы в динамически связанные библиотеки разрешаются.

Как было предложено Space_C0wb0y, просмотрите en.wikipedia.org/wiki/Dynamic_linker для получения подробной информации о том, что происходит.

Ответ 4

В вашей операционной системе предусмотрены так называемые системные вызовы для динамического выделения памяти (malloc, free и т.д.), а также механизм загрузки и выполнения вашей программы.

Когда программа загружается с помощью os, текстовый сегмент (память кодов) настроен и статически выделенная память в вашей программе сразу же доступна. Поскольку функции вашего кода вызывают, в стеке выделяются (статически выделенные) переменные в ваших функциях, и ваша динамически распределенная память (например, с помощью malloc()) выделяется в куче. Во время выполнения вашей программы ответственность за управление памятью (ваша программистская ответственность) - это отсутствие утечки памяти и, в конечном итоге, приведет к тому, что у продолжительной программы закончится нехватка памяти, и она потерпит крах или в экстремальных ситуациях случаи, в зависимости от ОС, взять с собой всю ОС).

См. также эту статью: http://www.maxi-pedia.com/what+is+heap+and+stack