【问题标题】:What is the precise definition of the structure passed to the STAT system call?传递给 STAT 系统调用的结构的精确定义是什么?
【发布时间】:2015-03-25 07:24:50
【问题描述】:

我在哪里可以找到STAT 系列系统调用所期望的结构的精确定义

请注意,我指的是在汇编中调用的原始系统调用(x86_64 上的系统调用编号 456),而不是通常由 libc 提供的包装器.

手册页stat(2) 以及我从 linux 和 glibc 源代码中挖掘出来的内容给出了令人困惑和矛盾的结果(不同的结构字段排序、额外字段、填充)。

我确定我没有找到我应该去的地方是我的错,但我似乎无法找到我想要的信息。这导致我发布了这个问题。


澄清:我寻求的是任何给定架构上的系统调用返回的统计结构的确切定义。我知道我可以通过实验确定这些信息。实验仅限于我的特定架构。此外,我希望在某个地方记录一些与 Linux ABI 中使用的数据结构一样重要的东西。我想知道在哪里。

问题here 没有本文要求的信息。请取消将此帖子标记为重复。

【问题讨论】:

  • 为什么你认为系统调用 4、5、6 代表 stat() 系统调用?正如我从here 看到的,它们是__NR_io_getevents__NR_setxattr__NR_lsetxattr。我错过了什么吗?另外,您指的是哪个特定的内核版本?
  • @SamProtsenko 这是我传递给系统调用指令的数字。在我的系统x86_64/3.13.0 上,SYS_STAT 被定义为 __NR_stat,而在文件中又被定义为 4:/usr/include/x86_64-linux-gnu/asm/unistd_64.h

标签: linux assembly system-calls stat


【解决方案1】:

struct stat 定义严格取决于您的架构。例如。对于 x86_64,您可以在 arch/x86/include/uapi/asm/stat.h 中找到它。

在用户空间中,您可以在/usr/include/asm/stat.h 文件中找到相同的结构。

这里是 x86_64 的定义:

struct stat {
    __kernel_ulong_t    st_dev;
    __kernel_ulong_t    st_ino;
    __kernel_ulong_t    st_nlink;

    unsigned int        st_mode;
    unsigned int        st_uid;
    unsigned int        st_gid;
    unsigned int        __pad0;
    __kernel_ulong_t    st_rdev;
    __kernel_long_t     st_size;
    __kernel_long_t     st_blksize;
    __kernel_long_t     st_blocks;  /* Number 512-byte blocks allocated. */

    __kernel_ulong_t    st_atime;
    __kernel_ulong_t    st_atime_nsec;
    __kernel_ulong_t    st_mtime;
    __kernel_ulong_t    st_mtime_nsec;
    __kernel_ulong_t    st_ctime;
    __kernel_ulong_t    st_ctime_nsec;
    __kernel_long_t     __unused[3];
};

【讨论】:

  • 因此,对于任何架构,查找任何{ARCH} 的正确位置是/arch/{ARCH}/include/uapi/asm/stat.h。谢谢。
猜你喜欢
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2011-08-11
相关资源
最近更新 更多