開示:私はCにかなり慣れていません。回答を詳細に説明していただければ幸いです。
私は Linux カーネル モジュールを作成しています。作成中の関数の 1 つで、次のような構造をユーザー空間にコピーする必要があります。
typedef struct
{
uint32_t someProperty;
uint32_t numOfFruits;
uint32_t *arrayOfFruits;
} ObjectCapabilities;
私が実装している API には、メンバーを「各要素が FRUIT_TYPE 定数であるarrayOfFruits
サイズの配列」と説明するドキュメントがあります。numOfFruits
arrayOfFruits がポインターであることを考えると、これを行う方法がわかりません。構造体を作成するとcopy_to_user
、ポインターがユーザー空間にObjectCapabilities
コピーされるだけです。 arrayOfFruits
ユーザー空間はどのようにして配列の要素に継続的にアクセスできますか? これが私の試みです:
ObjectCapabilities caps;
caps.someProperty = 1024;
caps.numOfFruits = 3;
uint32_t localArray[] = {
FRUIT_TYPE_APPLE,
FRUIT_TYPE_ORANGE,
FRUIT_TYPE_BANANA
};
caps.arrayOfFruits = localArray;
そして、コピーのために... これだけできますか?
copy_to_user((void *)destination, &caps, (sizeof(caps) + (sizeof(localArray) / sizeof((localArray)[0]))));