使用 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 ,包括将内存转换为不同类型之类的方法,但是您可能需要自己进行内存管理。一切都取决于您具体要对页面做什么。
我想知道 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 ,包括将内存转换为不同类型之类的方法,但是您可能需要自己进行内存管理。一切都取决于您具体要对页面做什么。