使用 alloc_page return 值

Use of alloc_page return value

我想知道 alloc_page 的 return 值的用途,它分配页面和 returns struct page 的实例来表示保留块。但是,我不知道分配后如何使用该保留页。我很难理解那些东西,kmalloc 很简单,我们可以将内存分配到一个 char *buf 中,但是这个内核函数 return 一个结构,我不知道如何使用它满足我的需要。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>

struct page *p;

static int __init sys_module_init(void)
{
    p = alloc_page(GFP_KERNEL);

    pr_info(KBUILD_MODNAME ": Hello, World!\n");
    return 0;
}

static void __exit sys_module_exit(void)
{
    __free_page(p);
    
    pr_info(KBUILD_MODNAME ": Bye, World!\n");
}

module_init(sys_module_init);
module_exit(sys_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Whosebug");

alloc_page() 级别低于 kmalloc()。如果 struct page 来自用户 space 程序,您需要先使用 kmap() 将其映射到内核地址 space。但是由于您使用 GFP_KERNEL 分配内核内存,因此您可以只获取页面结构,然后使用 page_address() 将其转换为虚拟地址。然后你可以在像memcpy()这样的函数中使用地址来向它写入数据。我敢肯定还有其他方法可以从页面 write/read ,包括将内存转换为不同类型之类的方法,但是您可能需要自己进行内存管理。一切都取决于您具体要对页面做什么。