在Linux的/ x86-64的系统调用结构组装程序员的布局?(Layout of structs

2019-08-07 01:30发布

许多的Linux / x86-64的系统调用接受指针结构作为参数。

出于示例的第二参数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 */
   };

这意味着,如果你想比你必须了解每种类型有多大规则,是否有成员为了对准之间的任何填充,等等,从单纯组装调用系统调用。

是否C标准离开这个开放为(编译器)中所定义的实现或可以将它从标准(假设原始类型的尺寸是已知的)来确定

如果它处于打开状态,并在内核或x86-64架构,无论如何界定呢? 或只是其中的编译器发生的内核与编译的问题?

(即给定的结构我需要计算的起始相对该构件的偏移该结构的地址的一些部件)

Answer 1:

结构的布局是不是在C标准定义,但在ABI的定义,你的情况System V的AMD64 ABI。 也就是说,在一般的布局是依赖于操作系统的,并指定该操作系统所有的编译器必须符合ABI(尽管大多数将不得不选择产生不同的布局,如果你知道你在做什么)。 该ABI还定义参数是如何传递给函数,如何返回值,寄存器必须在调用保存,等等。

你需要应该可以在ABI的定义http://www.x86-64.org/ (似乎是向下)



Answer 2:

在Linux / x86-64的:

字节是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)它的元素类型的对准。



文章来源: Layout of structs in Linux/x86-64 syscalls for assembly programmers?