Для чего эта область памяти? - PullRequest
0 голосов
/ 27 ноября 2018

Когда я запускаю свою программу на C и проверяю ее файл / proc / PID / maps, я вижу три строки об исполняемом файле:

1:

00400000-00401000 r-xp 00000000 08:03 38404099 /previous_path/a.out

2:

00600000-00601000 r--p 00000000 08:03 38404099 /previous_path/a.out

3:

0601000-00602000 rw-p 00001000 08:03 38404099 /previous_path/a.out

Я думаю, что первый хранит код, а третий хранит глобальные переменные, но я понятия не имею, для чего второй.Кто-нибудь может мне это объяснить?

1 Ответ

0 голосов
/ 28 ноября 2018

Позвольте мне попытаться ответить на это в общем режиме.Исполняемый файл - это набор инструкций, которые указывают загрузчику, как настроить адресное пространство программы.Загрузчик будет отображать страницы в адресное пространство процесса, следуя этим инструкциям.

Все допустимые страницы будут доступны для чтения.Таким образом, вы имеете дело только с комбинациями

Исполняемый (X) и Записываемый (W)

, что дает возможные комбинации

R
RX
RXW
R W

RXW необычно, но этопроисходят.Я видел приложения, которые кодируют свои инструкции и декодируют во время выполнения.Мы можем игнорировать этот случай.На самом деле один остается с:

R      Readonly (Data, such as strings or numeric constants, tabular data)
RX     Code
R W    Read Write (static, global, stack, heap, etc.)

Если у вас есть что-то вроде

 const char something [] = "SOMETHING" ;

Текст ЧТО-то, скорее всего, будет на странице только для чтения.

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