将size_t保存在原始内存块中并将其恢复

时间:2013-09-25 21:11:20

标签: c memory kernel kernel-module

我在内核域中的原始内存块中保存了size_t类型的数据,然后我将整个内存块发送到用户区域,并尝试返回size_t值。 / p>

在内核和用户区都不保证类型大小相同,所以我想知道保存值然后恢复它的最佳方法是什么。

编辑:

或者,也许只保存另一种类型的数据,而不是两侧具有相同的大小,并且可以转换(或转换为没有数据丢失)到/来自size_t

编辑2:

我将按以下格式保存数据:

(size_of_data_chunk)(data_chunk)(size_of_data_chunk)(data_chunk)...

公共代码:

内核中的代码:

void add_chunk(membuffer *buffer, void *chunk, size_t size){

    if(buffer->data != NULL){
        buffer->data = krealloc(buffer->data, buffer->len + sizeof(size_t) + size, GFP_KERNEL);
        buffer->len += sizeof(size_t) + size;

        memcpy(buffer->data + buffer->len, &size, sizeof(size_t));
        memcpy(buffer->data + buffer->len + sizeof(size_t), chunk, size);
    }else{

        buffer->data = kmalloc(sizeof(size_t) + size, GFP_KERNEL);
        buffer->len = sizeof(size_t) + size;

        memcpy(buffer->data, &size, sizeof(size_t));
        memcpy(buffer->data + sizeof(size_t), chunk, size);

    }

}

用户土地代码:

void *get_chunk(membuffer *buffer){

    size_t *size;
    void *new_buffer;
    void *chunk = NULL;

    size = malloc(sizeof(size_t));

    memcpy(size, buffer->data, sizeof(size_t));

    chunk = malloc(*size);
    memcpy(chunk, buffer->data + sizeof(size_t), *size);

    buffer->data = malloc(buffer->len - sizeof(size_t) - *size);

    memcpy(buffer->data, buffer->data + sizeof(size_t) + *size, buffer->len - sizeof(size_t) - *size);

    free(size);

    return chunk;
}

请注意,我知道每个块上将包含哪种类型的数据,因此我不需要保存类型或任何其他信息,只需要保存块的大小和块本身。

另请注意,这是我尚未完成的(也就是测试)代码。可能缺少一些free

1 个答案:

答案 0 :(得分:1)

看了一会儿之后,似乎size_t有点奇怪。 This post引用维基百科(虽然看起来引用的文本不再存在),因为size_t通过stdlib.h定义stddef.h。我检查了我的Ubuntu 12.04安装确实:

/* Get size_t, wchar_t and NULL from <stddef.h>.  */
#define     __need_size_t
#ifndef __need_malloc_and_calloc
# define    __need_wchar_t
# define    __need_NULL
#endif

stddef.h文件非常复杂,所以我不会在这里引用它,但typedef __SIZE_TYPE__ size_t看起来也是外部定义的。我还没有进一步追溯它,因为它变得越来越粘。

最后,我相信size_t应该在给定的架构中保持一致,无论是内核还是glibc。

在我的32位Ubuntu安装中,sizeof(size_t)始终返回4,无论是来自用户应用程序还是来自hello world内核的可加载模块。