1

Я работаю над Ubuntu 14.04 LTS.Как работает mmap() при использовании в исполняемом файле?

  • Есть два файла: file1.c и file2.c
  • Они собраны в exec1 и exec2 соответственно. file2.c использует функции из статической библиотеки.

exec1 карты exec2 в это виртуальное адресное пространство с помощью mmap. Следующие строки из file1.c:

#define MAX_SIZE_BYTES 4000000 
fd = open(exec2_path, O_RDONLY); 
addr = mmap(NULL, MAX_SIZE_BYTES, PROT_READ, MAP_FILE | MAP_SHARED, fd, 0); 

Следующая серия событий происходит:

  1. exec1 выполняется.
  2. exec1 mmaps exec2 в своем виртуальном адресном пространстве (что именно здесь происходит?)
  3. exec2 выполняется (на данном этапе, exec1 продолжает работать в фоновом режиме, что именно сейчас происходит.?)

PS: Я намерен знать, что произойдет, когда exec2 находится на диске, и это mmap ed от exec1? Как изменилось виртуальное адресное пространство и таблицы страниц, соответствующие exec1?
Затем, когда exec2 фактически выполнен, он доведен до основной памяти. Как все меняется? Где в памяти находятся функции статической библиотеки, которые используются в file2.c? У меня нет четкого представления об этом процессе. Может ли кто-нибудь пролить свет на эту тему?

+0

Я не могу понять, что вы пытаетесь сделать с этим кодом. Похоже, вы пытаетесь сопоставить память исполняемого файла, а затем отбрасываете адрес, на который вы его сопоставили. – user3344003

+0

Я не понимаю, как я отбрасываю адрес? – jsp99

+0

mmap(), в большинстве своих настроек, возвращает адрес отображения. – user3344003

ответ

1

Это то, что вы идете с логической точки зрения. Под этим я подразумеваю, что я упрощаю проблемы файловой системы, которые возникают в некоторых системах eunuchs.

Ваш вызов mmap фактически создает новый файл страницы, где exec2_path указывает этот файл. Вы настраиваете страницы только для чтения, используя этот файл, с addr, указывающим на начало диапазона страниц. Если вы начнете получать доступ к памяти, указанной в addr, это вызовет ошибки страницы, которые будут загружать данные из файла exec2_path.

Поскольку у вас есть доступ только для чтения к файлу exec2_path, его запуск также не влияет на исполняемый файл, выполняющий сопоставление.

mmap имеет два применения, которые я могу придумать с головы. Только для чтения memmaps часто являются наиболее эффективным способом чтения больших файлов, с которыми вы должны работать в памяти, например декодирования изображений.

Меморандумы чтения/записи могут использоваться (совместно с механизмами блокировки) для обмена данными между процессами.

+0

«Если вы начнете обращаться к памяти, указанной в addr, это вызовет ошибки страницы, которые будут загружать данные из файла exec2_path». Если я получаю доступ к памяти, указанной addr после запуска exec2, она не даст мне ошибку страницы (в 'exec1'), так как исполняемый' exec2' находится в ОЗУ. Я прав? – jsp99

+0

В большинстве систем (не, например, встроенных) исполняемый файл не является картой того, как он существует в памяти. Исполняемый файл представляет собой набор инструкций, описывающих, как изображение должно быть создано в памяти. Некоторые части исполняемого файла часто отображаются в памяти (исполняемый код, данные только для чтения). Поэтому ваш исполняемый файл вряд ли будет загружен в память в exec1. – user3344003

+0

«exec1» mmaps для исполняемого файла exec2 (с учетом исполняемого файла 'exec2' отличается от процесса' exec2'). И из моего ограниченного понимания, я думаю, что текстовый сегмент процесса 'exec2' содержит исполняемый файл' exec2' (набор инструкций, описывающих, как изображение должно быть создано в памяти). Пожалуйста, поправьте меня, если я ошибаюсь. – jsp99