簡體   English   中英

用於匯編程序員的Linux / x86-64系統調用中的結構布局?

[英]Layout of structs in Linux/x86-64 syscalls for assembly programmers?

許多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架構是否仍然定義它? 或者只是內核碰巧編譯的編譯器問題?

(這是結構的一些成員我需要計算該成員相對於struct的地址的起始偏移量)

結構的布局未在C標准中定義,但在ABI定義中,在您的情況下是System V AMD64 ABI。 也就是說,通常布局是依賴於操作系統的,並且所有針對該操作系統的編譯器必須符合ABI(盡管如果您知道自己在做什么,大多數編譯器都會選擇生成不同的布局)。 ABI還定義了如何將參數傳遞給函數,如何返回值,哪些寄存器必須在調用之間保留,等等。

您需要的ABI定義應該在http://www.x86-64.org/上提供 (似乎已關閉)

在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)其元素類型的對齊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM