我已经google了一下,发现大多数人都主张使用kmalloc
,因为你可以保证获得连续的物理内存块.但是,kmalloc
如果找不到您想要的连续物理块,它似乎也会失败.
拥有一块连续的内存块有什么好处?具体来说,为什么我需要在系统调用中拥有连续的物理内存块?我有什么理由不能使用吗?
最后,如果我在处理系统调用期间分配内存,我应该指定吗?系统调用是在原子上下文中执行的吗?vmalloc
GFP_ATOMIC
GFP_ATOMIC
分配是高优先级的,不会睡眠.这是在中断处理程序,下半部分和其他无法睡眠的情况下使用的标志.
GFP_KERNEL
这是正常分配,可能会阻止.这是在安全睡眠时在进程上下文代码中使用的标志.
GFP
flags in 是什么意思kmalloc
?例如GFP_KERNEL
,GFP_ATOMIC
?
假设我们想要在设备驱动程序或模块中维护一个内存池.如何创建该池并使其可用于多个进程,可以说4个进程,访问此驱动程序/模块.
假设池中有1 MB内存.
当我读LDD时,我遇到了api的mempool_create(),但之后还有kmalloc.
如果有人做了这样的事情,请分享知识.
我最初的方法是使用kmalloc()进行分配,然后为打开模块的每个进程维护私有对象中的开始和结束指针.
编辑:谢谢@kikigood花了一些时间在这上面.所以基于你的评论,我做了这样的事情.
假设我在初始化期间分配了1MB的mempool.我想将进程数限制为4,所以我保持计数.每次都增加这个数量
atomic_t count =0;
open()
{
if(count >4)
return -ENOMEM;
count++;
}
Run Code Online (Sandbox Code Playgroud)
我还在每个进程的私有设备结构中维护一个缓冲区.
如何将池中的某些内存分配给此缓冲区.
memory-management kernel-module linux-device-driver linux-kernel kmalloc
很偶然地在内核丛林中偶然发现了一些代码并且有点困惑。有两种实现kzalloc()
:在tools/virtio/linux/kernel.h 中,主要的在linux/slab.h 中。显然,在大多数情况下,使用第二个。但有时使用“virtio” kzalloc()
。
“virtio”kzalloc()
看起来像这样:
static inline void *kzalloc(size_t s, gfp_t gfp)
{
void *p = kmalloc(s, gfp);
memset(p, 0, s);
return p;
}
Run Code Online (Sandbox Code Playgroud)
我的困惑是kmalloc()
在“tools”目录中使用的“fake”会返回 NULL 指针。此外,该memset()
实现似乎不检查 NULL 指针,因此可能存在 NULL 指针取消引用。这是一个错误还是我错过了什么?
我正在编写一个设备驱动程序,除其他外,它分配一块内存kmalloc
.用户程序关闭文件时释放此内存.在我的一个实验中,用户程序在没有关闭文件的情况下崩溃.
有什么东西可以释放这段记忆吗?
在另一个实验中,我将函数kfree()
从close()
函数移动到module_exit()
函数.当我连续两次运行用户程序时,我kmalloc
再次使用与之前相同的指针进行调用,而不是先将其释放.因此,我丢失了指向该内存的指针,并且无法释放它.
在我重新启动之前,这个内存是否会丢失到系统中,或者在我卸载驱动程序时它是否会被释放?
据我了解,GFP_USER
标志中的使用(在对 的调用中kmalloc
)用于为用户空间分配内存。这是否意味着分配的页面位于用户可以访问的内核空间中?这些页面是否需要mmapp
在用户空间中编辑,或者用户可以直接访问该地址。如果他们需要,mmapp
那么GFP_USER
和之间有什么区别GFP_KERNEL
?