12

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

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

ответ

10

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

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

Как правило, это плохая идея, кстати :-)

6

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

Related image1 http://windowsitpro.com/content/content/3686/figure_01.gif

или это:

Related image

Оба На рисунке выше приведены характеристики аппаратной памяти x86 MMU, не связанные с ядром Linux.

Ниже описано, как VMAs связан с task_struct текущего процесса:

Related image http://image9.360doc.com/DownloadImg/2010/05/0320/3083800_2.gif

Related image http://images.slideplayer.com/16/5079265/slides/slide_24.jpg

И смотрит в саму функцию здесь:

http://lxr.free-electrons.com/source/mm/memory.c#L1756

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

Image result for page protection flags linux kernel 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;

+0

«часть этого совпадает с частью таблицы страниц ядра, которая не дублируется для каждого процесса», когда вы говорите, что вы имеете в виду, что есть только одна копия таблицы страниц для отображения ядра, которая используется всеми процессами ? Не могли бы вы подробнее рассказать о том, как это можно сделать? – user31986

+0

Возможно, прочитайте следующее: http://turkeyland.net/projects/overflow/intro.php , а на картинке вы можете увидеть, что один процесс ОДИН набор таблиц страниц, базовый адрес которого будет загружен в регистр CR3. И для всех этих виртуальных адресов (специально для ядра), которые должны быть разделены между разными процессами, все они будут иметь одинаковое значение, указывающее на одну и ту же физическую страницу. желающий это проясните. –

+0

Как удерживать «мм семафор»? –