2010-07-09 1 views
13

Когда речь идет о памяти процесса, я слышал о таких вещах, как код памяти и память данных.Как управляется память кода?

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

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

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

Спасибо.

ответ

17

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

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

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

Borrowed from duartes.org http://static.duartes.org/img/blogPosts/linuxFlexibleAddressSpaceLayout.png

+1

очень хороший link ... – wrapperm

+0

I второй оберткаm. :) – smwikipedia

+2

Макет, как правило, устанавливается (и управляется) компоновщиком, а не ядром.Ядро просто считывает информацию в исполняемом изображении и соответственно настраивает карту памяти. Динамический компоновщик будет отображаться, если исполняемый файл так задает (что делает для динамически связанных исполняемых файлов) и обрабатывает много вещей. Вы можете подумать о «компоновщике» компоновщика ОС, но вы можете создать собственный компоновщик, который делает практически все, что угодно, –

2

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

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

+1

Просмотрите эту статью о динамической загрузке, чтобы узнать, что происходит дальше: http://en.wikipedia.org/wiki/Dynamic_linker –

+0

Спасибо Space_C0wb0y, эта ссылка полезна. – smwikipedia

0

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

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

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

+0

Куча не управляется ядром в большинстве операционных систем. Обычно это компонент пользовательского режима, находящийся в какой-то библиотеке времени выполнения (например, ntdll, libc), которая затем делает системные вызовы для функций обработки страниц более низкого уровня (например, NtAllocateVirtualMemory). – wj32

4

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

+1

Ну, ну .... это зависит от операционной системы. Как я помню из книги А. Сильбершаца об операционных системах, некоторые архитектуры могут перемещать код, но он должен быть прозрачным для программиста. Кроме того, загрузка/выгрузка динамических библиотек включает в себя некоторое управление памятью кода. – doc

+0

@doc: Правда, но это зависит от ОС и архитектуры. То, что я сказал выше, основано главным образом на том, чтобы заглянуть в формат исполняемого файла OS X. – JeremyP

Смежные вопросы