3

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 バイトでアラインされたアドレスで満たされていました。基本的に、構造体の配置を制御するものは何ですか? 構造体内のフィールドのパディングの概念については明確であることに注意してください。構造体自体のアライメント要件は、私が混乱しているものです。

4

1 に答える 1

6

構造体のアライメント要件は、そのメンバーの最大のアライメント要件です。この場合、struct list_headポインタが含まれているため、のアラインメントstruct list_headは 8 バイトです。がstruct __wait_queue_head含まれているためstruct list_head、そのアラインメントも 8 バイトです。これが必要なのは、構造体のアライメント要件が緩い場合、構造体のパディングでは、メンバーが適切にアライメントされることを保証するのに十分ではないためです。

于 2012-04-12T12:30:41.747 に答える