Что означает тема "Mapped" в Linux / proc / meminfo? Я видел несколько однострочников, которые говорят мне, что это «Общий объем памяти в килобайтах, который отображается устройствами или библиотеками с помощью mmap». Но теперь я потратил почти двадцать часов на поиск исходного кода ядра 2.6.30.5, пытаясь подтвердить это утверждение, и я не смог этого сделать - на самом деле я вижу некоторые вещи, которые, кажется, конфликтуют с ним.
Счет "Mapped" хранится в global_page_state[NR_FILE_MAPPED]
. Комментарий рядом с объявлением NR_FILE_MAPPED
гласит: «Страницы Pagecache сопоставлены с таблицами страниц. Изменяются только из контекста процесса».
Не все ли страницы, на которые ссылается тема кэширования meminfo, подкреплены файлами? Разве это не значит, что все эти страницы должны быть «сопоставлены»? Я просмотрел несколько десятков списков meminfo из разных архитектур, и всегда значение «Mapped» намного меньше значения «Cached».
В любой момент времени большая часть памяти заполнена исполняемыми образами и общими библиотеками. Глядя на / proc / pid / smaps, я вижу, что все они отображаются в VMA. Все ли они отображаются в памяти с помощью mmap ()? Если так, то почему "Mapped" такой маленький? Если они не отображаются в память с помощью mmap (), как они отображаются? Вызов handle_mm_fault
, который вызывается get_user_pages
и различными архитектурно-зависимыми обработчиками ошибок страницы, увеличивает счетчик "Mapped", и они, похоже, делают это для любой страницы, связанной с VMA.
Я смотрел на функции mmap () группы драйверов. Многие из них вызывают vm_insert_page
или remap_vmalloc_range
для установления своих отображений, и эти функции увеличивают счетчик «Отображения». Но многие другие драйверы, похоже, вызывают remap_pfn_range
, что, насколько я могу судить, не увеличивает счетчик "Mapping".