【问题标题】:What is the difference between vm_insert_page() and remap_pfn_range()?vm_insert_page() 和 remap_pfn_range() 有什么区别?
【发布时间】:2015-02-12 14:33:51
【问题描述】:

我想使用ioremap_wc() 将设备内存 (NIC) 映射到内核空间内存区域。然后我想将内存区域从内核空间重新映射到用户空间,我可以为此使用 2 个函数:vm_insert_page()remap_pfn_range()

POSIX mmap(3) 通常使用第二个:remap_pfn_range()

vm_insert_page()remap_pfn_range() 有什么区别,什么时候需要使用vm_insert_page() 而不是remap_pfn_range()

【问题讨论】:

    标签: c linux-kernel posix linux-device-driver mmap


    【解决方案1】:

    顾名思义,vm_insert_page() 映射一个单页,而remap_pfn_range() 映射一个连续的内核内存块。检查原型和cmetsvm_insert_pageremap_pfn_range

    例如可以使用vm_insert_page映射vmalloc aree

    do {
        page = vmalloc_to_page(vaddr);
        vm_insert_page(vma, uaddr, page);
        vaddr += PAGE_SIZE;
    } while(/* there is something to map */);
    

    不可能使用remap_pfn_range,因为它只映射一个连续的内核内存块。

    另一个区别是remap_pfn_range 不仅可以映射 RAM 缓冲区,还可以映射其他范围。使用vm_inser_page,您只能映射 RAM 缓冲区

    来自 Linus 的 explanation

    【讨论】:

    • 谢谢!这是否意味着,我不能使用 vm_inser_page 将设备内存 (NIC) 区域从内核空间重新映射到用户空间,因为 “使用 vm_inser_page 你只能映射 RAM 缓冲区”
    • 没错,你只能映射pagevm_insert_page
    【解决方案2】:

    vm_insert_page() 允许驱动程序将他们分配的各个页面插入到用户 vma 中。该页面必须在内核中独立分配。它要求页面是为此目的获得的零序分配。它不会发出警告,也不需要设置 PG_reserved。

    传统上,这是使用remap_pfn_range() 完成的,它采用任意页面保护参数。 vm_insert_page() 不允许这样做。你的 vma 保护必须正确设置,这意味着如果你想要一个共享的可写映射,你最好请求一个共享的可写映射!

    remap_pfn_range() 用于将一组页面映射或重新映射到内存中。

    Refer

    【讨论】:

    • 谢谢! IE。 “这意味着如果你想要一个共享的可写映射,你最好要求一个共享的可写映射!” - 这是否意味着我必须使用remap_pfn_range()来重新映射设备从内核空间到用户空间的内存 (NIC) 区域?
    猜你喜欢
    • 2016-04-03
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多