gpt4 book ai didi

linux - 在 linux 驱动程序中,为什么在函数中传递数据指针时 kfree 不起作用?

转载 作者:太空宇宙 更新时间:2023-11-04 12:54:37 29 4
gpt4 key购买 nike

我试着做一个简单的程序。源代码如下。当插入模块时,我尝试 kmalloc 一些内存。然后释放内存,当移除模块时。但是我使用命令 free 发现它在移除模块时并没有释放内存。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/vmalloc.h>

#define FILE_NAME "test"

typedef struct info
{
char data[1048576];
}sInfo;

static sInfo* Info;

int mmap_alloc2(void* buf, int require_buf_size)
{
struct page *page;
void* mmap_buf;

unsigned long mmap_size = PAGE_ALIGN(require_buf_size);
printk("size=%lu\n",mmap_size);
buf = kzalloc(mmap_size, GFP_KERNEL);
if (!buf) {
return -1;
}
mmap_buf = buf;
for (page = virt_to_page(mmap_buf); page < virt_to_page(mmap_buf + mmap_size); page++) {
SetPageReserved(page);
}

return 0;
}

void mmap_free2(void* buf, int require_buf_size)
{
struct page *page;
void *mmap_buf = buf;

unsigned long mmap_size = PAGE_ALIGN(require_buf_size);
printk("size=%lu\n",mmap_size);
for (page = virt_to_page(mmap_buf); page < virt_to_page(mmap_buf + mmap_size); page++) {
ClearPageReserved(page);
}
kfree((sInfo*)buf);
mmap_buf = NULL;
}

static int mmap_example_init(void)
{
struct proc_dir_entry *pEntry = NULL;
printk("mmap example init\n");

if(!(pEntry = create_proc_entry(FILE_NAME, 0666, NULL)))
{
printk("create proc entry fail\n");
return -EFAULT;
}

mmap_alloc2(Info, sizeof(sInfo));
return 0;
}

static void mmap_example_exit(void)
{
printk("mmap example exit\n");
mmap_free2(Info, sizeof(sInfo));
remove_proc_entry(FILE_NAME,NULL);
}

module_init(mmap_example_init);
module_exit(mmap_example_exit);

但是当我将数据指针从函数更改为全局范围时,kfree 起作用了。代码如下。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/vmalloc.h>


#define FILE_NAME "test"

static void* mmap_buf;
typedef struct info
{
char data[1048576];
}sInfo;

static sInfo* Info;

int mmap_alloc1(int require_buf_size)
{
struct page *page;

int mmap_size = PAGE_ALIGN(require_buf_size);
mmap_buf = kzalloc(mmap_size, GFP_KERNEL);
if (!mmap_buf) {
return -1;
}
for (page = virt_to_page(mmap_buf ); page < virt_to_page(mmap_buf + mmap_size); page++) {
SetPageReserved(page);
}

return 0;
}

void mmap_free1(int require_buf_size)
{
struct page *page;
unsigned long mmap_size = PAGE_ALIGN(require_buf_size);
for (page = virt_to_page(mmap_buf); page < virt_to_page(mmap_buf + mmap_size); page++) {
ClearPageReserved(page);
}
kfree(mmap_buf);
mmap_buf = NULL;
}


static int mmap_example_init(void)
{
struct proc_dir_entry *pEntry = NULL;
printk("mmap example init\n");

if(!(pEntry = create_proc_entry(FILE_NAME, 0666, NULL)))
{
printk("create proc entry fail\n");
return -EFAULT;
}
mmap_alloc1(sizeof(sInfo));
return 0;
}

static void mmap_example_exit(void)
{
printk("mmap example exit\n");
mmap_free1(sizeof(sInfo));
remove_proc_entry(FILE_NAME,NULL);
}

module_init(mmap_example_init);
module_exit(mmap_example_exit);

那么这两个代码有什么区别呢?以及如何修改 sample1 以使 kfree 工作?

最佳答案

在第一个代码示例中,您正在分配内存,但并未真正将地址分配给指针变量 Info。而你的 mmap_buf 是一个局部变量,在第一种情况下它实际上没有做任何事情。所以你正试图释放一些随机地址。哪个可能有效也可能无效。通常它不会,而且绝对不是您要释放的内容。

您可以让 mmap_alloc2() 返回指针并将其分配给 Info,如 Info = mmap_alloc2(sizeof(sInfo)); 或将 Info 的地址传递给函数,如,int mmap_alloc2(void **buf, int require_buf_size)*buf = kzalloc(mmap_size, GFP_KERNEL);。用 mmap_alloc2(&Info, sizeof(sInfo));

调用它

关于linux - 在 linux 驱动程序中,为什么在函数中传递数据指针时 kfree 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36145797/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com