gpt4 book ai didi

c - 将 size_t 保存在原始内存块中并将其取回

转载 作者:行者123 更新时间:2023-11-30 15:45:29 24 4
gpt4 key购买 nike

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

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

另请注意,这是我尚未完成的(也称为测试)代码。也许缺少一些免费

最佳答案

看了一会儿,似乎 size_t 有点奇怪。 This post引用维基百科(尽管看起来引用的文本不再存在)说 size_t 是通过 stddef.hstdlib.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 内核可加载模块。

关于c - 将 size_t 保存在原始内存块中并将其取回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19015281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com