Linuxカーネルについて勉強していますが、問題があります。
多くのLinuxカーネルソースファイルにcurrent->files
。では、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;
}
これは、現在のプロセス(システムコールを発行したプロセス)へのポインタです。
X86では、Arch/x86/include/current.h
(他のアーチ用の類似ファイル)。
#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 */
Linuxデバイスドライバー の第2章の詳細:
現在のポインタは、現在実行中のユーザープロセスを参照します。 openやreadなどのシステムコールの実行中、現在のプロセスは、呼び出しを呼び出したプロセスです。カーネルコードは、必要に応じて、currentを使用してプロセス固有の情報を使用できます。 [...]
Current
は、タイプstruct task_struct
のグローバル変数です。定義は[1]にあります。
Files
はstruct files_struct
であり、現在のプロセスで使用されているファイルの情報が含まれています。
[1] http://students.mimuw.edu.pl/SO/LabLinux/PROCESY/ZRODLA/sched.h.html