微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

alloc_page 返回值的使用

如何解决alloc_page 返回值的使用

我想知道alloc_page的返回值的用途,它分配page并返回一个struct page的实例来表示保留块的开始。但是,我不知道如何在分配后使用该保留页。我无法理解这些东西,kmalloc 非常简单,例如我们可以将内存分配到 char *buf 中,但是这个内核函数返回一个结构,我不知道如何使用它来满足我的需要.

#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("StackOverflow");

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。