web-dev-qa-db-fra.com

Quel est le "courant" dans la source du noyau Linux?

J'étudie le noyau Linux et j'ai un problème.

Je vois que de nombreux fichiers source du noyau Linux ont current->files. Alors, quel est le current?

struct file *fget(unsigned int fd)
{
     struct file *file;
     struct files_struct *files = current->files;

     rcu_read_lock();
     file = fcheck_files(files, fd);
     if (file) {
             /* File object ref couldn't be taken */
             if (file->f_mode & FMODE_PATH ||
                 !atomic_long_inc_not_zero(&file->f_count))
                     file = NULL;
     }
     rcu_read_unlock();

     return file;
 }
24
Kahn Cse

Il s'agit d'un pointeur vers le processus en cours (c'est-à-dire le processus qui a émis l'appel système).

Sur x86, il est défini dans Arch/x86/include/current.h (fichiers similaires pour les autres arches).

#ifndef _ASM_X86_CURRENT_H
#define _ASM_X86_CURRENT_H

#include <linux/compiler.h>
#include <asm/percpu.h>

#ifndef __Assembly__
struct task_struct;

DECLARE_PER_CPU(struct task_struct *, current_task);

static __always_inline struct task_struct *get_current(void)
{
    return percpu_read_stable(current_task);
}

#define current get_current()

#endif /* __Assembly__ */

#endif /* _ASM_X86_CURRENT_H */

Plus d'informations dans Linux Device Drivers chapitre 2:

Le pointeur actuel fait référence au processus utilisateur en cours d'exécution. Lors de l'exécution d'un appel système, comme open ou read, le processus en cours est celui qui a appelé l'appel. Le code du noyau peut utiliser des informations spécifiques au processus en utilisant current, s'il doit le faire. [...]

34
Mat

Current est une variable globale de type struct task_struct. Vous pouvez trouver sa définition à [1].

Files est un struct files_struct et il contient des informations sur les fichiers utilisés par le processus en cours.

[1] http://students.mimuw.edu.pl/SO/LabLinux/PROCESY/ZRODLA/sched.h.html

2
coredump