问题描述
我想知道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()
之类的函数中使用该地址向其写入数据。我确信还有其他方法可以从页面写入/读取,包括将内存转换为不同类型,但您可能需要自己进行内存管理。一切都取决于您想对页面做什么。