Как функции, аргументы функций и локальный стек физически организованы в памяти? - PullRequest
0 голосов
/ 05 января 2012

Я бы хотел понять, что это на самом деле означает, когда кто-то читает из отладчика, что такая-то функция живет по адресу 0xsuchandsuch, эта переменная foo по адресу 0xfoosaddressуказывает на область памяти по адресу 0xpointedmemory и т. д.

Где можно найти ресурсы о том, как организована память для программ, скомпилированных из C?Это зависит от компилятора?Платформозависимость

Ответы [ 4 ]

1 голос
/ 05 января 2012

Как правило, платформа (комбинация процессора и операционной системы) определяет способ управления памятью.Компилятор должен подчиняться правилам, установленным платформой.Они обычно указываются в чем-то, что называется ABI (двоичный интерфейс приложения).Для Solaris (в основном также для других UNIX-подобных систем) вы можете многое узнать из книги Питера ван дер Линдена «Программирование на Expert C».

0 голосов
/ 05 января 2012

Я бы сказал, что вы можете разделить компьютеры на две категории:

1) Небольшие системы, такие как современные встроенные системы (хотя многие настольные компьютеры раньше выглядели так, когда-то). Существует только один большой диапазон памяти, и когда компоновщик говорит, что он находится по определенному адресу, он действительно сохраняется там.

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

Я бы порекомендовал вам начать с простого компилятора для простого компилятора и посмотреть, что он выводит. Например, вы можете использовать встроенный процессор MSP430 и, скажем, бесплатную версию Kickstart компилятора IAR. В руководстве описано, как организована память и как выполняется процесс запуска и т. Д.

0 голосов
/ 05 января 2012

Для машин Intel вы можете начать с самого начала: 8086

0 голосов
/ 05 января 2012

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

Обычно (опять же, специфичная для конкретной реализации) скомпилированная c-программа организуется в разные области памяти.

Написать Великий Кодекс том 1 от Риндалл Хайд классифицирует эти разделы для одной из реализаций как:

  • Кодовая секция - содержит программные машинные инструкции
  • Постоянное сечение - содержит сгенерированные компилятором данные только для чтения
  • Данные только для чтения Раздел - содержит пользовательские данные, которые только читаются, но никогда не записываются
  • Статический раздел - содержит пользовательские инициализированные статические переменные
  • Раздел BSS - содержит пользовательские неинициализированные переменные
  • Секция стека - содержит локальные переменные и другие временные данные
  • Раздел кучи - содержит динамические переменные
  • Зарезервированный раздел для O.S
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...