我将size_t
类型的数据保存在内核区域的原始内存块中,然后将整个内存块发送到用户区域,然后尝试取回该size_t
值。
这种类型在内核和用户领域都无法保证大小相等,因此我想知道保存值然后恢复它的最佳方法是什么。
编辑:
或者,也许只是保存另一种类型的数据,但它们的两边大小均相同,并且可以与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;
}
请注意,我知道每个块上将包含什么类型的数据,因此我不需要保存类型或任何其他信息,只需保存块的大小和块本身。
另请注意,这是我尚未完成的(aka测试)代码。也许某些
free
丢失了。 最佳答案
在看了一段时间之后,看来size_t
有点奇怪。 This post引用Wikipedia(尽管看起来好像不再有引用的文本了)说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)
始终从用户应用程序或hello world内核可加载模块返回4。