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;
}
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. [...]
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