あるタイプのデータをカーネル ランドの生のメモリ ブロックに保存して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
の が欠落している可能性があります。