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

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

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

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

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

  • Понимание MMAP
  • Сомнение о mmap
  • proc / sys / vm / flush_mmap_pages отсутствует в ядре 3.9, как его получить?
  • Pagemap на устройствах с отображением памяти не работает
  • Если я mmap файл из tmpfs, будет ли он удвоить использование памяти?
  • Как найти часть кода, который создает анонимную приватную память
  • Та же программа, которая использует «mmap», ведет себя по-разному на разных машинах
  • Как работает mmap'ing / dev / mem, несмотря на то, что он находится в непривилегированном режиме?
  • 3 Solutions collect form web for “Размер памяти для работы с ядром ядра”

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

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

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

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

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

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

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

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

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

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

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

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

    #define PAGE_SHIFT 12

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

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.