【发布时间】:2013-09-25 21:11:20
【问题描述】:
我将size_t 类型的数据保存在内核态的原始内存块中,然后我将整个内存块发送到用户态并尝试取回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;
}
请注意,我知道每个块将包含什么类型的数据,因此我不需要保存类型或任何其他信息,只需保存块的大小和块本身。
另请注意,这是我尚未完成(又名测试)的代码。也许有些free 不见了。
【问题讨论】:
-
当你说“原始内存块”时,你到底在使用什么机制(双方)?
-
@BenjaminLeinweber 请看我的编辑
-
我不是这个意思。您如何在用户空间中分配内存,然后如何尝试在内核空间中访问它?您使用的具体系统调用是什么?
-
@BenjaminLeinweber 哦,对不起。 :编辑:
-
出于好奇,你在哪里看到的
size_t不保证是一样的?
标签: c memory kernel kernel-module