getuid在哪里参考?

时间:2017-09-03 07:17:49

标签: linux

我对linux中的getuid()geteuid()有疑问。 我知道getuid将返回当前进程的真实用户ID。此外,geteuid()将返回当前进程的有效用户ID。

我的问题是,存储有关id的信息。除了 / etc / passwd 之外,我认为每个进程都应该在某处存储自己的id信息。
如果我是对的,请告诉我存储的信息在哪里(比如堆栈区域)。如果我错了,这个过程如何得到它的身份?

2 个答案:

答案 0 :(得分:3)

这是由内核在其内部内存结构中维护的。

Linux内核使用名为struct task_struct的东西:

  

Linux下的每个进程都动态分配struct task_struct结构。

在Linux内核4.12.10中,定义如下:

task_struct.h

struct task_struct {
    ...
    /* Objective and real subjective task credentials (COW): */
    const struct cred __rcu     *real_cred;

    /* Effective (overridable) subjective task credentials (COW): */
    const struct cred __rcu     *cred;

cred.h

struct cred {
    ...
    kuid_t      uid;        /* real UID of the task */
    kgid_t      gid;        /* real GID of the task */
    kuid_t      suid;       /* saved UID of the task */
    kgid_t      sgid;       /* saved GID of the task */
    kuid_t      euid;       /* effective UID of the task */
    kgid_t      egid;       /* effective GID of the task */
    kuid_t      fsuid;      /* UID for VFS ops */
    kgid_t      fsgid;      /* GID for VFS ops */

用户空间进程无法直接访问这些结构。要获取此信息,此类进程必须使用系统调用(例如getuid()geteuid())或/proc文件系统。

答案 1 :(得分:1)

阅读Advanced Linux Programming,也许Operating System: Three Easy Pieces(两者都可免费下载)。

(需要几本书来回答你的问题)

getuid(2)(与getpid(2)和其他许多人一样)system callLinux kernel提供并实施。 syscalls(2)是他们的列表。

(请花点时间详细了解系统调用)

  

存储有关id的信息。

内核管理描述每个process的数据(在内核内存中,有关详细信息,请参阅NPE's answer)。每个系统调用都是一个原始的原子操作(从user-space角度来看)并返回一个结果(通常在某个寄存器中,而不是在内存中)。阅读CPU modes

因此,该进程的用户级virtual address space中的信息,每次调用getuid时都会返回该信息。