В концепции виртуальной памяти — каждый процесс поддерживает свою собственную таблицу страниц. Эта таблица страниц отображает виртуальный адрес в виртуальный адрес ядра. Этот виртуальный адрес ядра переводит адрес в физическую память. Я понимаю, что существует структура ядра Kernel Virtual adddres — vm. Эта структура области VM, наконец, отображает этот адрес на физический адрес.
Когда я делаю cat / proc // maps — я вижу прямое сопоставление виртуального адреса с физическим адресом. Потому что он сопоставляет адрес с файлом — с помощью inode. Итак, похоже, что это адрес на жестком диске, дескриптор файла, старший-младший номер. Есть несколько адресов, которые находятся в оперативной памяти. Итак, я могу сказать, что не вижу таблицы, в которой виртуальный адрес сопоставлен с виртуальным адресом ядра. Я хочу увидеть эту таблицу. Как я могу это увидеть? Не должно быть в пространстве ядра. Поскольку, когда процесс обращается, скажем, к памяти — 0x1681010, то это должно быть переведено в адрес виртуальной памяти ядра. Наконец, этот адрес должен быть переведен в адрес физической памяти.
Нет, Ядро Linux поддерживает таблицы страниц процессов (но не сами процессы). Процессы видят только виртуальная память через их адресное пространство. Процессы используют некоторые Системные вызовы, как например ММАП (2) или же execve (2), изменить свое адресное пространство.
Физические адреса и таблицы страниц, а также управление и управление MMU это бизнес ядра, которое на самом деле обеспечивает некоторые «абстрактная машина«(с виртуальными адресными пространствами, системными вызовами как элементарными элементарными операциями и т. д.) для пользовательских приложений. Приложения не видят необработанное (x86) оборудование, а только пользовательский режим как дано ядром. Некоторые аппаратные ресурсы и инструкции для них недоступны (они запускаются только в пространство пользователя).
Таблицы страниц управляются ядром, и на самом деле различные процессы могут использовать разные — или иногда одни и те же таблицы страниц. (Так переключатели контекста управляемый Kernl, возможно, потребуется перенастроить MMU). Вам все равно (и пользовательские процессы не видят таблицы страниц), ядро будет управлять ими.
И нет, /proc/self/maps
не показывает ничего о физических адресах, только о виртуальных. Ядру разрешено перемещать процессы из одного ядра в другое, перемещать страницы с одного физического (не виртуального) адреса на другое и т. Д. В любое время; и приложения обычно не видят этого (они могут запросить это с mincore (2), getcpu (2) и через Proc (5) …)
Приложения не должны заботиться о физическое память или прерывания, лайк ошибки страницы (только ядро заботится об этом; иногда отправляя сигналы).
Преобразование виртуальных адресов в физические происходит в MMU. Обычно он успешен (возможно, с прозрачным доступом к таблицам страниц), и процессор отправляет по шине в ОЗУ преобразованный физический адрес (соответствующий некоторому виртуальному адресу, обрабатываемому машинной инструкцией режима пользователя). Когда MMU не может справиться с этим, происходит сбой страницы, который обрабатывается ядром (которое может поменять местами какую-либо страницу, отправить SIGSEGV
, сделать переключение контекста и т.д …)
Смотрите также архитектура процессора, набор инструкций, таблица страниц, пейджинг, переводный буфер, кэш, x86 а также x86-64 вики-страницы (и следуйте всем ссылкам, которые я дал вам).
Других решений пока нет …