汇编程序员的 Linux/x86-64 系统调用中的结构布局?

2023-12-27

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

例如第二个参数stat(2) is 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 架构是否定义了它?或者这只是内核碰巧使用哪个编译器进行编译的问题?

(给定结构体的某个成员,我需要计算该成员相对于结构体地址的起始偏移量)


结构的布局不是在 C 标准中定义的,而是在 ABI 定义中定义的,在您的例子中是 System V AMD64 ABI。也就是说,一般来说,布局是依赖于操作系统的,并且所有针对该操作系统的编译器都必须符合 ABI(尽管如果您知道自己在做什么,大多数编译器都可以选择生成不同的布局)。 ABI 还定义了如何将参数传递给函数、如何返回值、在调用过程中必须保留哪些寄存器等等。

您需要的 ABI 定义应该可以在http://www.x86-64.org/ http://www.x86-64.org/(貌似已经下来了)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编程序员的 Linux/x86-64 系统调用中的结构布局? 的相关文章

随机推荐