2014-12-21 4 views
4

Я хочу, чтобы добавить новое поле (для хранения количества готовых процесса этого пользователя) в user_struct в файле Linux-источник/ядро ​​/ user.cдобавить еще одно поле для user_struct

struct user_struct { 
    atomic_t ready_processes; /* I add this field */ 
    /* not important fields */ 
} 

где инициализировать это поле правильно?

ответ

4

Для того, чтобы добавить новое поле в user_struct, что вам нужно сделать 3 вещи:

  1. Определение user_struct находится в файле sched.h (включить/Linux/sched.h)
    You должно добавить ваше поле в struct.

    struct user_struct { 
        atomic_t ready_processes; /* I added this line! */ 
        /*Other fields*/ 
    }; 
    
  2. В user.c (ядро/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,  
    }; 
    
  3. Вы сделали с инициализацией вашего поля для корневого пользователя, но вы также должны инициализировать его для других пользователей.
    С этой целью в 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! */ 
    

Примечание: Это работает в Linux 2.6.32.62. Я не уверен в других версиях, но думаю, что это не должно быть совсем иначе.

Смежные вопросы