Мне всегда нравится видеть вещи, а не просто читать теорию.Согласно этой записи в блоге , получается, что если вы открываете программу с помощью windbg, даже если она не запущена, она все равно отображается в адресном пространстве, как если бы она была.Таким образом, ваше окно разборки в переносном смысле (не гарантирует загрузки вашего кода по этим точным адресам) показывает вам, что находится по этим адресам в терминах кода:
Конечно, вы можетеНе гарантируйте эти адреса благодаря ASLR, но он дает вам представление / заставляет задуматься: адреса памяти также являются просто кодом.Код и память хранятся в том же (виртуальном) пространстве, что и в архитектуре Von Neumann , которую реализует большинство современных компьютеров.К сожалению, так как нет стека, кучи и т. Д., Вы не можете перемещаться и смотреть на них.
В этом блоге от Microsoft представлен обзор высокого уровня виртуального адресного пространства.Как видите, половина из них зарезервирована для использования операционной системой, а другую половину вы можете заполнить всем, что у вас есть (код, malloc
вызовы, распределение стека и т. Д.).
С точки зрения того, как адресное пространство работает на стороне пользователя, эта диаграмма помогла мне понять это.Он связан в этом вопросе , который предоставляет ряд приличных ссылок на различные возможные карты.Помните, однако, что расположение в памяти будет отличаться с точки зрения частей.
Важно помнить, что все это, программа, данные, стек, куча, содержимое ядра, представляет собой одну большую последовательную последовательность адресов памяти, хотя они могут или не могут фактически преобразовываться в реальные адреса памяти.
Пока вы занимаетесь этим, вас также может интересовать, как исполняемый файл отображается на диске. В этой статье и в этой статье, в частности , представлен некоторый углубленный анализ формата файла PE.В последней статье также есть небольшая диаграмма, показывающая примерно, как данные mmap'd.