Размер памяти для работы ядра mmap


9

Меня интересует способ, которым файлы Linux mmaps помещаются в основную память (в моем контексте это для выполнения, но я предполагаю, что процесс mmap одинаков для записи и чтения) и какой размер он использует.

Итак, я знаю, что Linux использует подкачку страниц размером обычно 4 КБ (где в ядре я могу найти этот размер?). Но что именно это означает для выделенной памяти: предположим, что у вас есть двоичный файл размером в несколько тысяч байтов, давайте просто скажем 5812B, и вы выполните его. Что происходит в ядре: выделяет ли оно 2 * 4 КБ, а затем копирует 5812 В в это пространство, тратя больше 3 КБ основной памяти на 2-й странице?

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

Мой второй вопрос также очень прост: я предположил, что размер файла - 5812B. Правильно ли, что этот размер просто взят из inode?

Ответы:


6

Не существует прямой зависимости между размером исполняемого файла и размером в памяти. Вот очень быстрый обзор того, что происходит, когда исполняется двоичный файл:

  1. Ядро анализирует файл и разбивает его на разделы. Некоторые разделы загружаются непосредственно в память, на отдельных страницах. Некоторые разделы вообще не загружаются (например, символы отладки).
  2. Если исполняемый файл динамически связан, ядро ​​вызывает динамический загрузчик, загружает необходимые разделяемые библиотеки и выполняет редактирование ссылок по мере необходимости.
  3. Программа начинает выполнять свой код, и обычно она запрашивает больше памяти для хранения данных.

Для получения дополнительной информации об исполняемых форматах, связывании и загрузке исполняемых файлов вы можете прочитать Linkers and Loaders by John R. Levine .

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

В Linux вы можете проверить соответствие памяти исполняемому файлу cat /proc/$pid/maps. Формат задокументирован в proc(5)справочной странице; см. также Понимание Linux / proc / id / maps .


0

Да, вы в конечном итоге получите две страницы 4k. Данные загружаются по требованию, поэтому, если ничего не ссылается на вторую страницу, они никогда не будут загружены в память.

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

Не меняйте эти значения и ожидайте, что что-нибудь сработает.

Да, размер файла хранится в inode в ext2 / 3.


0

Для части определения на ядре 2.6.38 для архитектуры Intel:

арка / x86 / включать / ASM / page_types.h:

/ * PAGE_SHIFT определяет размер страницы * /

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC (1, UL) << PAGE_SHIFT)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.