我正在研究 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/asm/current.h
中定义(其他 archs 的类似文件)。
#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 Device Drivers第 2 章:
当前指针是指当前正在执行的用户进程。在系统调用的执行过程中,如打开或读取,当前进程是调用该调用的进程。内核代码可以通过使用 current 来使用特定于进程的信息,如果它需要这样做的话。[...]
Current
是struct task_struct
类型的全局变量。您可以在 [1] 中找到它的定义。
Files
是struct files_struct
,它包含当前进程使用的文件的信息。
这是 ARM64 定义。在arch/arm64/include/asm/current.h
中,https://elixir.bootlin.com/linux/latest/source/arch/arm64/include/asm/current.h
struct task_struct;
/*
* We don't use read_sysreg() as we want the compiler to cache the value where
* possible.
*/
static __always_inline struct task_struct *get_current(void)
{
unsigned long sp_el0;
asm ("mrs %0, sp_el0" : "=r" (sp_el0));
return (struct task_struct *)sp_el0;
}
#define current get_current()
,它只使用sp_el0
寄存器。作为指向当前进程task_struct
的指针
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(80条)