Linux kernel kmalloc反复返回相同的地址[Linux2.4]

Linux kernel kmalloc反复返回相同的地址[Linux2.4],linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我在linux内核(2.4)中编写了一些代码,出于某种原因,kmalloc返回了相同的地址(我相信这只会在测试过程中发生)。我检查了在对kmalloc的调用之间没有对kfree进行调用(即内存仍在使用) 也许我记性不好了?(kmalloc没有返回NULL…) 你知道怎么会发生这样的事吗 提前感谢您的帮助 代码: *我在每次kmalloc和kfree之后打印,我绝对确定kmalloc(返回相同地址)之间不会调用kfree。我不知道kmalloc的数据结构是什么样子,但如果之前的双空闲导致缓冲区链接

我在linux内核(2.4)中编写了一些代码,出于某种原因,kmalloc返回了相同的地址(我相信这只会在测试过程中发生)。我检查了在对kmalloc的调用之间没有对kfree进行调用(即内存仍在使用)

也许我记性不好了?(kmalloc没有返回NULL…)

你知道怎么会发生这样的事吗

提前感谢您的帮助

代码:


*我在每次kmalloc和kfree之后打印,我绝对确定kmalloc(返回相同地址)之间不会调用kfree。

我不知道kmalloc的数据结构是什么样子,但如果之前的双空闲导致缓冲区链接列表中出现循环,您可以想象这种情况。进一步的空闲仍然可以链接到其他不同的缓冲区(可以重新分配),但一旦这些缓冲区耗尽,最后一个缓冲区将无限期地返回

typedef struct
{
    char* buffer;
    int read_count;
    int write_count;
    struct semaphore read_sm;
    struct semaphore write_sm;
    int reader_ready;
    int writer_ready;
    int createTimeStamp;
} data_buffer_t ;

typedef struct vsf_t vsf_t;

struct vsf_t
{
    int minor;
    int type;
    int open_count;
    int waiting_pid;
    data_buffer_t* data;
    list_t proc_list;
    vsf_t* otherSide_vsf;
    int real_create_time_stamp;
};

int create_vsf(struct inode *inode, struct file *filp, struct vsf_command_parameters* parms)
{
...
    buff_data = allocate_buffer();
    if (buff_data == NULL)
    {
        kfree(this_vsfRead);
        kfree(this_vsfWrite);
        return -ENOMEM;
    }
...
}

data_buffer_t* allocate_buffer()
{
...
    data_buffer_t* this_buff = (data_buffer_t*)kmalloc(sizeof(data_buffer_t), GFP_KERNEL);
    if (this_buff == NULL)
    {
        printk( KERN_WARNING "failure at allocating memory\n" );
        return NULL;
    }
...
return this_buff;
}