12

remap_pfn_range函数(用于调用驱动程序中的mmap)可用于将内核内存映射到用户空间。它是如何完成的?任何人都可以解释精确的步骤内核模式是特权模式(PM),而用户空间是非特权(NPM)。在PM中,CPU可以访问所有内存,而在NPM中,某些内存受到限制 - 不能由CPU访问。当调用remap_pfn_range时,现在仅限于PM的内存范围现在是如何被用户空间访问的?remap_pfn_range如何将内核内存重新映射到用户空间?

看着remap_pfn_range代码有pgprot_t struct。这是保护映射相关的结构。什么是保护映射?这是上述问题的答案吗?

回答

10

确实很简单,内核内存(通常)只是简单地有一个页表项,其中的体系结构特定位表示:“此页表项仅在CPU处于内核模式时有效”。

remap_pfn_range所做的是创建另一个页表项,使用不同虚拟地址指向没有设置该位的同一物理内存页面。

通常情况下,这是一个坏主意BTW :-)

6

机制的核心是页表MMU:

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

或本:

Related image

两个上面的图片是x86硬件内存MMU的特性,与Linux内核无关。

下面描述的音乐录影带大奖是如何链接到进程的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 2015-09-02 02:09:56

+0

也许读到这个:http://turkeyland.net/projects/overflow/intro.php 从图片可以看到,一个进程的一组页表,其基地址将被加载到CR3寄存器。对于要在不同进程中共享的所有这些虚拟地址(特定于内核),所有这些都将具有指向相同物理页面的相同值。希望澄清。 – 2015-09-03 02:47:44

+0

如何保持“毫米信号量”? – 2015-12-29 20:03:09

相关问题