向 user_struct 添加另一个字段

sam*_*man 5 kernel linux-kernel

我想向文件 linux-source/kernel/user.c 中的 user_struct 添加新字段(以存储此用户的就绪进程数)

struct user_struct {
    atomic_t ready_processes; /* I add this field */
    /* not important fields */
}
Run Code Online (Sandbox Code Playgroud)

在哪里正确初始化这个字段?

Ali*_*edi 6

为了向 中添加新字段user_struct,您需要做 3 件事:

  1. 的定义user_struct在文件 sched.h(include/linux/sched.h)
    你应该在那个中添加你的字段struct

    struct user_struct {
        atomic_t ready_processes; /* I added this line! */
        /*Other fields*/
    };
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在 user.c (kernel/user.c) 第 51 行,user_struct被实例化为root_user全局。在此处为您的字段赋值。

    struct user_struct root_user = {
        .ready_processes = ATOMIC_INIT(1), /* I added this line! */
        .__count    = ATOMIC_INIT(2),
        .processes  = ATOMIC_INIT(1),
        .files      = ATOMIC_INIT(0),
        .sigpending = ATOMIC_INIT(0),
        .locked_shm     = 0,
        .user_ns    = &init_user_ns,    
    };
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您已完成为 root 用户初始化您的字段,但您还应该为其他用户初始化它。
    为此,在 user.c 中,转到alloc_uid分配和初始化新用户的函数。例如,您看到有一行atomic_set(&new->__count, 1);初始化__count. 在此旁边添加您的初始化代码。

    atomic_set(&new->__count, 1);
    atomic_set(&new->ready_processes, 1); /* I added this line! */
    
    Run Code Online (Sandbox Code Playgroud)

注意:它适用于 linux 2.6.32.62。我不确定其他版本,但我认为它不应该有很大不同。