私はシンプルな質問があります:構造体の内容をユーザー空間からカーネル空間にコピーする必要がある場合(例:ioctl呼び出し(またはviceversa)):copy_to_userと構造体を持つcopy_from_user
typedef struct my_struct{
int a;
char b;
} my_struct;
ユーザ空間:
my_struct s;
s.a = 11;
s.b = 'X';
ioctl(fd, MY_CMD, &s);
Kernelspace:
int my_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
unsigned long arg)
{
...
my_struct ks;
copy_from_user(&ks, (void __user *)arg, sizeof(ks));
...
}
私はSTの大きさを考えますユーザー空間(変数s
)とカーネル空間(変数ks
)のルーキールは同じではない可能性があります(__attribute__((packed))
を指定せずに)。だからcopy_from_user
のバイト数をsizeof
マクロで指定するのは正しいですか?カーネルソースには、パックされていると宣言されていない構造がいくつかありますが、サイズがユーザー空間とカーネル空間で同じになることはどうして保証されていますか?
ありがとうございました!
たとえば、アプリケーションをコンパイルしてカーネルを構築し、構造体をパックすることを選択したアプリケーションをコンパイルします。しかし、リンクをありがとう!非常に面白いです... – MirkoBanchi
事実、構造体とそのレイアウトは、カーネルによって定義されたカーネルABIの一部です。 これは実際にはioctl()インタフェースの破壊の良い例です。 –
構造体が特定の方法でメモリにレイアウトされていると仮定するのは一般的に安全ではありませんか? – Cuadue