Дополнительная информация о макете памяти исполняемой программы (процесса)
Я присутствовал на собеседовании для samsung. Они задали много вопросов по макету памяти программы. Я ничего об этом не знаю.
Я искал его «Макет памяти исполняемой программы». «Макет памяти процесса».
Я с удивлением вижу, что информации по этим темам мало. Большинство результатов – это вопросы форума. Мне просто интересно, почему?
- Как загрузить сборку во время выполнения перед событием AssemblyResolve?
- Возможно ли одноуровневое многоязычное развертывание Windows Forms (ILMerge и спутниковые сборки / локализация)?
- В чем разница между MOV и LEA?
- Как сделать kernel для моего загрузчика?
- Сколько циклов процессора требуется для каждой инструкции сборки?
Это несколько ссылок, которые я нашел:
- Организация хранения во время выполнения
- Организация времени выполнения
- Макет памяти процесса C ^ pdf ^
Я хочу изучить это из правильной книги, а не для некоторых веб-ссылок. (Рэнди Хайд – также книга, но другая книга). В какой книге я могу найти ясную и более подробную информацию по этому вопросу?
Я также удивляюсь, почему книга по операционным системам не покрывала это в своих книгах? Я читал 6-е издание. Он просто обсуждает блок управления процессом.
Это полное создание макета – это задача linker
? Где я могу больше узнать об этом процессе. Я хочу, чтобы COMPLETE- информация из программы на диске выполнялась на процессоре.
РЕДАКТИРОВАТЬ:
Поначалу я был неясен даже после прочтения ответов, приведенных ниже. Недавно я просмотрел эти статьи после их прочтения, я ясно понял вещи.
Ресурсы, которые помогли мне понять:
- www.tenouk.com/Bufferoverflowc/Bufferoverflow1b.html
- 5 часть учебника по формату PE-файла: http://win32assembly.online.fr/tutorials.html
- Отличная статья: http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html
- PE Explorer: http://www.heaventools.com/
Да, «макет исполняемой программы (PE / ELF)»! = «Макет памяти процесса»). Выведите для себя 3-ю ссылку. 🙂
После устранения моих понятий мои вопросы заставляют меня выглядеть такой глупой. 🙂
- Использование разных версий одной и той же сборки в одной папке
- Что регистрирует сохранение в соглашении вызова ARM C?
- Как скомпилировать и запустить программу C в Sublime Text 2?
- .NET Assembly Diff / Compare Tool - Что доступно?
- Visual Studio 2010 не создает перед запуском при изменении кода
- Ошибка в построении gradleа после обновления Android Studio с log4j
- Не удалось загрузить файл или сборку HRESULT: 0x80131515 (При добавлении controllerа в проект MVC с ссылками на сборку на сетевом диске)
- Как получить вывод ассемблера из источника C / C ++ в gcc?
То, как вещи загружаются, очень сильно зависит от ОС и от используемого бинарного формата, а детали могут стать неприятными. Существуют стандарты для того, как выкладываются двоичные файлы, но на самом деле это зависит от ОС, как выкладывается память процесса. Вероятно, поэтому документация трудно найти.
Чтобы ответить на ваши вопросы:
- Книги:
- Если вы заинтересованы в том, как процессы выкладывают свою память, посмотрите на « Понимание ядра Linux» . В главе 3 рассказывается о дескрипторах процессов, создании процессов и разрушающих процессах.
- Единственная книга, которую я знаю о том, что касается ссылок и загрузки в деталях, это Linkers and Loaders от John Levine. Там есть онлайн-версия и версия для печати, поэтому проверьте это.
-
Исполняемый код создается компилятором и компоновщиком, но это компоновщик, который помещает вещи в бинарный формат, который требуется ОС. В Linux этот формат, как правило, ELF , для Windows и более старых Unix – это COFF , а для Mac OS X это Mach-O . Однако это не фиксированный список. Некоторые ОС могут поддерживать и поддерживать несколько двоичных форматов. Линкерам необходимо знать выходной формат для создания исполняемых файлов.
-
Макет памяти процесса похож на двоичный формат, потому что многие бинарные форматы предназначены для
mmap'd
так что задача загрузчика проще.Однако это не совсем так. Некоторые части бинарного формата (например, статические данные) не хранятся непосредственно в двоичном файле. Вместо этого двоичный код просто содержит размер этих разделов. Когда процесс загружается в память, загрузчик знает, чтобы выделить нужное количество памяти, но двоичный файл не должен содержать большие пустые разделы.
Кроме того, макет памяти процесса включает в себя некоторое пространство для стека и кучи , где идут кадры вызова процесса и динамически распределенная память. Они обычно живут на противоположных концах большого адресного пространства.
Это действительно просто царапает поверхность загрузки двоичных файлов, и она не покрывает ничего о динамических библиотеках. Для подробного описания работы динамической компоновки и загрузки читайте « Как писать общие библиотеки» .
Вот один из способов, которым программа может быть выполнена из файла (* nix).
- Процесс создается (например, fork ()). Это дает новому процессу собственную карту памяти. Это включает стек в некоторой области памяти (обычно где-то в памяти).
- Новый процесс вызывает exec (), чтобы заменить текущий исполняемый файл (часто оболочку) новым исполняемым файлом. Часто для отображения страницы запроса настраиваются новые исполняемые файлы .text (исполняемый код и константы) и .data (r / w инициализированные переменные), то есть они отображаются в пространство памяти процесса по мере необходимости. Часто сначала начинается раздел .text, за которым следует .data. Раздел .bss (неинициализированные переменные) часто выделяется после раздела .data. Много раз он сопоставляется для возврата страницы нhive, когда страница, содержащая переменную bss, сначала открывается. Куча часто начинается с границы следующей страницы после раздела .bss. Затем куча растет в памяти, когда стек растет (помните, что я сказал обычно, есть исключения!).
Если куча и стол сталкиваются, это часто вызывает ситуацию с нерабочей памятью, поэтому стек часто помещается в большую память.
В системе без блока управления памятью запрос пейджинга обычно недоступен, но часто используется тот же макет памяти.
Искусство сборки программного обеспечения http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/Windows/PDFs/MemoryAccessandOrg.pdf