1

私の目的は、カーネル空間から常にアクセスできるように、常にカーネル メモリに配列またはリストを保持することです。これを行うために、ここで推奨されているように netlink ソケットを使用しています。文字列を送信する方法を示すこの例に従います。ソケット内の構造体の配列または構造体のリストを送信する方法がわかりません。

typedef struct {
    int fiveDollarBills;
    int denDollarBills;
} Bills;

netlink を使用してリストまたは配列を送信することは可能ですか?

4

1 に答える 1

1

NetLink 自体は、データが文字列、整数、構造体などであるかどうかを気にしません。単に void* と長さを取り、それを見ずにデータをコピーします。構造体を void* にキャストし、sizeof を使用して長さを決定し、そのデータを netlink 経由で送信できます。

もう一方の端では、void* と長さを取得し、長さが想定どおりであることを確認し、void* を構造体へのポインターにキャストするだけです。確認する重要な点は次の 2 つです。

  1. UserSpace と KernelSpace の両方のコードで、構造体のメモリ レイアウトが一致しています。これは、同じ .h に対して両方をコンパイルし、メモリ レイアウトとアラインメントが同じになるようにコンパイル オプションを設定することを意味します。

  2. 構造体は単なる生のメモリ コピーとして転送されます。ポインターを修正するためのインテリジェンスがないため、構造体にポインターを含めることはできません。

もう1つのオプションは、生データを送信するのではなく、データを既知の形式の文字列から変換して自分で「シリアル化」することです。これにより、余分な CPU とメモリのオーバーヘッドを犠牲にして、より複雑なデータ構造を処理できるようになります。

于 2010-12-14T19:09:17.117 に答える