Распределение памяти программы - PullRequest
0 голосов
/ 17 января 2012

Я пытаюсь понять, как распределяется память программы во время выполнения и различные разделы или «сегменты» программы (если это правильное слово). Я почти там, но не совсем и мог бы немного помочь.

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

Следующие вопросы иллюстрируют мою путаницу:

  1. Что такое раздел .rodata и где он существует?
  2. Как работает .data? раздел в MASM отличается от раздела .data?
  3. Должна ли каждая программа иметь стандартные секции .data, .bss, .code, или эти конвенции просто руководящие принципы?
  4. Что определяет, какие разделы доступны для чтения, записи и выполнения?

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 17 января 2012
  1. .rodata для данных только для чтения , констант и литералов, см. this .

  2. в соответствии с это , .data? для неинициализированных данных, или .bss секционные данные, .data для инициализированных данных.

  3. В соответствии с Windows PE форматом вы никогда не сможете предположить, что присутствуют определенные разделы и их порядок (поскольку они утверждают, что это определено компилятором). однако, довольно стандартно иметь .data и .code, но все же, вы должны всегда проверять PE, поэтому его там есть.

  4. Это делается через заголовки разделов PE, так как это зависит от ОС (или зависит от PE: win, elf или mach-o), см. Параграф здесь , в частности Characteristics поле дескриптора раздела (опять-таки только для Windows , вам нужно использовать PE-компоновку для выбранной вами ОС).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...