Как управляется память кода?
Говоря о памяти процесса, я слышал о таких вещах, как память кода и память данных.
И для памяти данных существует 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