kmalloc 一遍又一遍地返回相同的地址 [Linux 2.4]

发布于 11-16 22:04 字数 1296 浏览 2 评论 0原文

我在 linux 内核(2.4)中处理一些代码,并且由于某种原因 kmalloc 返回相同的地址(我相信它只在测试中间发生)。我检查了在调用 kmalloc 之间没有调用 kfree (即内存仍在使用中)。

也许我记不清了? (kmalloc 没有返回 NULL...)

关于如何发生这样的事情有什么想法吗?

预先感谢您的帮助!

代码:

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;
}

*我在每个 kmalloc 和 kfree 之后打印,我绝对确定 kmalloc 之间没有调用 kfree (返回相同的地址)

I working on some code in the linux kernel (2.4) and for some reason kmalloc returns the same address (I believe it only happens after the middle of the test). I checked that no calls to kfree were made between the calls to kmalloc (i.e memory is still in use).

maybe I'm out of memory ? (kmalloc didn't return NULL...)

any ideas on how such a thing can happen ?

thanks in advance for the help!

code:

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;
}

*I print after every kmalloc and kfree,I'm absolutely sure that no kfree is called between kmalloc's (that return the same adress)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

2024-11-23 22:04:41

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

I don't know what kmalloc's data structures look like but you could imagine this happening if a previous double free caused a cycle in a linked list of buffers. Further frees could still chain on additional distinct buffers (able to be reallocated) but once those were exhausted that last buffer would be returned indefinitely.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文