我有一个配备了2GB内存的设置,我想将1GB(或更多)物理内存映射到用户空间虚拟地址中。从理论上讲,在32位设置中,3GB的虚拟地址可供用户应用程序使用。
我使用以下参数更新了内核命令行:
我的自定义驱动程序将处理用户空间的
但是该函数会在
我通常使用
这是一个32位的x86内核,即“i386”架构。
我使用以下参数更新了内核命令行:
mem=1G memmap=1G$1G
以便强制内核看到1GB的RAM并保留最后1GB。我的自定义驱动程序将处理用户空间的
mmap()
调用,并使用remap_pfn_range()
函数将物理地址0x40000000(1G)映射到用户空间地址。但是该函数会在
remap_pte_range()
中触发内核BUG()。与300MB重新映射相比,同样的调用曾经起作用。我通常使用
ioremap()
在我的驱动程序中将物理地址映射到内核虚拟地址。在这种情况下,我不能这样做,因为1G / 3G虚拟地址被分割(1G用于内核,3G用于应用程序)。因此,我想知道是否可以将物理地址映射到用户空间虚拟地址,而不将这些物理地址映射到内核中?这是一个32位的x86内核,即“i386”架构。
__builtin_expect(x, y)
总是返回x
。如果x
为真,BUG_ON(x)
宏会触发。因此,你的逻辑链中有些问题。 - Gunther PiezBUG()
宏由remap_pte_range() BUG_ON(!pte_none(*pte))
调用。 我必须为我的项目使用旧内核(2.6.18),但我没有找到配置CONFIG_TRANSPARENT_HUGEPAGE
。 - user1259743