【问题标题】:Difference between return values of alloc_pages() and get_free_pages()alloc_pages() 和 get_free_pages() 返回值的区别
【发布时间】:2013-08-20 04:59:10
【问题描述】:

为什么我们要求 alloc_pages() 与其他内存分配器函数(get_free_pages()、kmalloc())不同,返回指向结构页面的指针? 请提供一个用例。 是不是和HIGHMEM Zone分配有关?

【问题讨论】:

    标签: memory-management linux-kernel


    【解决方案1】:

    alloc_pages(mask, order) 分配 2order pages 并返回一个 struct page 的实例来表示保留块的开始。如果只请求一页,alloc_page(mask) 是 order = 0 的较短表示法。

    __get_free_pages(mask, order) and __get_free_page(mask) 的工作方式与 上述函数,但返回保留内存块的虚拟地址而不是页面实例。

    kmalloc(size, mask) 保留一个大小字节的内存区域,并返回一个指向该区域开头的 void 指针。如果可用内存不足(在内核中这是一种非常不可能的情况,但必须始终满足这种情况),则结果为空指针。

    掩码指定有关请求的详细信息:

    • memory zone
    • behavior of allocator (blocking/unblocking request, etc.)
    • e.g. GFP_KERNEL, GFP_ATOMIC, GFP_DMA, etc
    

    alloc_pages() and __get_free_pages() : allocate pages, at low level

    kmalloc() : allocate physically contiguous sequence of bytes

    更多信息请参考professional linux kernel architecture by wolfgang mauerer

    【讨论】:

    • 我想问的是为什么这些函数有不同的返回值,因为一个返回逻辑地址和另一个返回指向结构页面的指针。为什么虽然两者都使用相同的伙伴分配器。
    • 内核中有很多地方需要处理页面结构。它们在处理高内存的任何情况下特别有用,因为在内核中没有固定地址空间。所以alloc_pages()在这些情况下使用。
    • 很抱歉再次打扰您,请您告诉我“内核空间中的恒定地址”是什么意思。我了解虚拟地址,逻辑地址和物理地址之间的区别以及它们之间的关系。所以请您将内核空间中的常量地址与它们联系起来。提前致谢。
    • 我的意思是内核逻辑地址,不存在内核逻辑地址的高端内存,因为超出了它的范围。一般来说高端内存是不会永久映射到内核地址空间的内存,所以只有访问它的方法可能是通过相应的结构页面结构。
    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2018-01-07
    • 2019-07-27
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多