64 ビット Linux マシンに次の構造体があります。
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;
};
where
typedef struct {
raw_spinlock_t raw_lock;
} spinlock_t;
and
struct list_head {
struct list_head *next, *prev;
};
raw_spinlock_t is defined as:
typedef struct {
volatile unsigned int slock;
} raw_spinlock_t;
ここで、LP64 標準に準拠した 64 ビット Linux マシンでの構造体 __wait_queue_head の配置を理解したいと思います。私が知っていることから、この構造体の最初のフィールド、つまり.
spinlock_t lock
は unsigned int であり、64 ビット マシンでは 4 バイトを占有します。この構造体は、4 バイト アラインされたアドレスで開始する必要があります。ただし、実際のシステムではそうではないことがわかりました。代わりに、構造体は 8 バイトでアラインされたアドレスで始まりますが、最初のフィールドのアラインメント要件は 4 バイトでアラインされたアドレスで満たされていました。基本的に、構造体の配置を制御するものは何ですか? 構造体内のフィールドのパディングの概念については明確であることに注意してください。構造体自体のアライメント要件は、私が混乱しているものです。