一尘不染

Linux内核代码中的“当前”

linux

当我经历了以下块的Linux的字符设备驱动程序代码,我发现结构的指针currentprintk

我想知道current指向的结构及其完整元素。

此结构有什么作用?

ssize_t sleepy_read (struct file *filp, char __user *buf, size_t count, loff_t *pos)
{
    printk(KERN_DEBUG "process %i (%s) going to sleep\n",
    current->pid, current->comm);
    wait_event_interruptible(wq, flag != 0);
    flag = 0;
    printk(KERN_DEBUG "awoken %i (%s)\n", current->pid, current->comm);
    return 0;
}

阅读 260

收藏
2020-06-07

共1个答案

一尘不染

它是指向当前进程(即已发出系统调用的进程)的指针。

文档

当前过程

尽管内核模块不像应用程序那样顺序执行,但是内核执行的大多数操作都与特定进程有关。内核代码可以通过访问全局项current来了解驱动它的当前进程,该全局项current是指向struct
task_struct的指针,该指针从内核的2.4版本开始在声明 <asm/current.h>,由包含<linux/sched.h>
当前指针是指当前正在执行的用户进程。
在执行系统调用(例如打开或读取)期间,当前进程是调用该调用的进程。
如果需要,内核代码可以通过使用current来使用特定于进程的信息。第5章“增强的Char驱动程序操作”的“设备文件上的访问控制”中提供了此技术的示例。

实际上,就像第一个Linux内核一样,current不再是正确的全局变量。开发人员通过将其隐藏在堆栈页面中来优化对描述当前过程的结构的访问。您可以在中查看当前的详细信息<asm/current.h>。尽管您将要看的代码看起来有些杂乱无章,但我们必须记住Linux是SMP兼容系统,并且在处理多个CPU时,全局变量根本无法工作。但是,实现的细节对其他内核子系统仍然是隐藏的,并且设备驱动程序可以仅包含并引用当前进程。

从模块的角度来看,电流就像外部参考printk一样。模块可以在任何合适的地方引用当前信息。例如,以下语句通过访问struct
task_struct中的某些字段来打印当前进程的进程ID和命令名称:

 printk("The process is \"%s\" (pid %i)\n",
  current->comm, current->pid);

当前-> comm中存储的命令名称是当前进程正在执行的程序文件的基本名称。

2020-06-07