0

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

4

1 に答える 1

1

これをしばらく見てみるsize_tと、ちょっと変な感じがします。 この投稿はウィキペディアを引用しています (引用されたテキストはもう存在しないようですが)、それはviasize_tで定義されていると言っています。Ubuntu 12.04のインストールを確認しましたが、実際には:stdlib.hstddef.h

/* 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 が返されます。

于 2013-09-25T22:24:53.913 に答える