9

多くの linux/x86-64 システムコールは、構造体へのポインターを引数として受け入れます。

たとえば、 の 2 番目のパラメーターstat(2)struct stat*...

   struct stat {
       dev_t     st_dev;     /* ID of device containing file */
       ino_t     st_ino;     /* inode number */
       mode_t    st_mode;    /* protection */
       nlink_t   st_nlink;   /* number of hard links */
       uid_t     st_uid;     /* user ID of owner */
       gid_t     st_gid;     /* group ID of owner */
       dev_t     st_rdev;    /* device ID (if special file) */
       off_t     st_size;    /* total size, in bytes */
       blksize_t st_blksize; /* blocksize for file system I/O */
       blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
       time_t    st_atime;   /* time of last access */
       time_t    st_mtime;   /* time of last modification */
       time_t    st_ctime;   /* time of last status change */
   };

つまり、純粋なアセンブリから syscall を呼び出したい場合は、各型の大きさや、位置合わせのためにメンバー間にパディングがあるかどうかなどの規則を知っておく必要があります。

C標準は、これを(コンパイラ)実装が定義されるように開いたままにしますか、それとも標準から決定できますか(プリミティブ型のサイズがわかっていると仮定して)?

開いたままにしておくと、カーネルまたは x86-64 アーキテクチャで定義されますか? それとも、カーネルがたまたまコンパイルされたコンパイラの問題ですか?

(これは、構造体のアドレスに対するそのメンバーの開始オフセットを計算する必要がある構造体のメンバーが与えられます)

4

2 に答える 2

14

構造体のレイアウトはC標準では定義されていませんが、ABI定義ではSystem V AMD64 ABIで定義されています。つまり、一般にレイアウトは OS に依存し、その OS を対象とするすべてのコンパイラは ABI に準拠する必要があります (ただし、何をしているのかわかっていれば、ほとんどの場合、別のレイアウトを生成するオプションがあります)。ABI は、パラメーターを関数に渡す方法、値を返す方法、呼び出し間で保持する必要があるレジスターなども定義します。

必要な ABI 定義は、http://www.x86-64.org/で入手できるはずです(ダウンしているようです) 。

于 2013-01-16T09:58:47.377 に答える
0

Linux/x86-64 では:

1 バイトは 8 ビットです。サイズとメモリアドレスは 1 バイト単位です。

プリミティブ型

プリミティブ型は、そのサイズに等しい配置を持っています。

プリミティブ型のサイズ (およびアラインメント) は次のとおりです。

bool 1
char 1
short 2
int 4
long 8
long long 8
__int128 16
void* 8
float 4
double 8
long double 16
__float128 16
__m64 8
__m128 16

構造体、共用体、および配列

  • 構造体 (および共用体) のアラインメントは、それらのコンポーネントの最大のアラインメントです。

  • 各構造体メンバーは、適切な配置で利用可能な最も低いオフセットに割り当てられます。

  • 構造体のサイズは、そのアラインメントの最も近い倍数に切り上げられます。

  • 構造体オブジェクトと共用体オブジェクトには、サイズと配置の制約を満たすためにパディングが必要になる場合があります。パディングの内容は未定義です。

  • 16 バイト未満の配列には、その要素型の位置合わせがあります。

  • 16 バイト以上の配列は、(a) 16 のうち大きい方のアラインメントを持ちます。(b) その要素型の配置。

于 2013-01-16T13:43:38.687 に答える