kmalloc снова и снова возвращает один и тот же адрес [Linux 2.4] - PullRequest
3 голосов
/ 23 июня 2011

Я работаю над некоторым кодом в ядре 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

1 Ответ

3 голосов
/ 23 июня 2011

Я не знаю, как выглядят структуры данных kmalloc, но вы могли бы представить, что это происходит, если предыдущее двойное освобождение вызвало цикл в связанном списке буферов. Дальнейшие освобождения могут по-прежнему связываться с дополнительными различными буферами (которые могут быть перераспределены), но как только они будут исчерпаны, последний буфер будет возвращаться бесконечно.

...