Как remap_pfn_range переназначает память ядра в пространство пользователя? - PullRequest
14 голосов
/ 09 января 2012
Функция

remap_pfn_range (используется в вызове mmap в драйвере) может использоваться для отображения памяти ядра в пространстве пользователя.Как это сделать?Кто-нибудь может объяснить точные шаги?Режим ядра - это привилегированный режим (PM), в то время как пространство пользователя не является привилегированным (NPM).В PM CPU может получить доступ ко всей памяти, тогда как в NPM некоторая память ограничена - CPU не может получить к ней доступ.Когда вызывается remap_pfn_range, как тот диапазон памяти, который был ограничен только PM, теперь доступен для пользовательского пространства?

Глядя на remap_pfn_range код, существует pgprot_t struct.Это структура, связанная с защитным отображением.Что такое картографирование защиты?Это ответ на поставленный выше вопрос?

Ответы [ 2 ]

13 голосов
/ 09 января 2012

На самом деле все просто, в памяти ядра (обычно) просто есть запись таблицы страниц с битом, специфичным для архитектуры, который говорит: «эта запись таблицы страниц действительна только тогда, когда процессор находится в режиме ядра».

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

Обычно это плохая идея, кстати: -)

5 голосов
/ 31 января 2012

Ядром механизма является страница таблицы MMU:

Похожие изображения1 http://windowsitpro.com/content/content/3686/figure_01.gif

или это:

Related image

Both picture above are characteristics of x86 hardware memory MMU, nothing to do with Linux kernel.

Below described how the VMAs is linked to the process's task_struct:

Похожие изображения http://image9.360doc.com/DownloadImg/2010/05/0320/3083800_2.gif

Похожие изображения http://images.slideplayer.com/16/5079265/slides/slide_24.jpg

И заглянем в саму функцию здесь:

http://lxr.free -electrons.com / источник / мм / memory.c # L1756

Данные в физической памяти могут быть доступны ядру через PTE ядра, как показано ниже:

Результат изображения для флагов защиты страницы ядра Linux http://www.tldp.org/LDP/tlk/mm/page-tables.gif

Но после вызова remap_pfn_range () получается PTE (для существующей памяти ядра, но для использования в пользовательском пространстве для доступа к ней) (с разными флагами защиты страницы). Память VMA процесса будет обновлена, чтобы использовать этот PTE для доступа к той же памяти, что сводит к минимуму необходимость тратить память на копирование. Но PTE ядра и пользовательского пространства имеют разные атрибуты, которые используются для управления доступом к физической памяти, и VMA также будет определять атрибуты на уровне процесса:

vma-> vm_flags | = VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...