当前位置: 首页 > 面试题库 >

Linux内核代码中的“当前”

宗意蕴
2023-03-14
问题内容

当我经历了以下块的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;
}

问题答案:

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

从文档:

当前过程

尽管内核模块不像应用程序那样顺序执行,但是内核执行的大多数操作都与特定进程有关。内核代码可以通过访问全局项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中存储的命令名称是当前进程正在执行的程序文件的基本名称。



 类似资料:
  • 问题内容: Linux内核代码中的EXPORT_SYMBOL_GPL是什么? 下面是一段代码,其中包含EXPORT_SYMBOL_GPL 该宏在内核代码中多次出现。 问题答案: 将某些符号(例如函数)定义为可导出(从内核可加载模块中看到)是宏。如果该符号没有“ EXPORT_SYMBOL”,则将无法从模块访问该符号。 将仅在GPL许可的模块中显示该符号,并且-在具有任何许可的模块中显示该符号。 h

  • 问题内容: 从这里 我没有得到它的含义以及为什么使用它。我试图搜索它,但不了解其含义。 问题答案: 它使动态加载的模块可以访问符号(前提是所述模块添加了声明)。

  • 问题内容: 我正在研究Linux内核,但是有问题。 我看到许多Linux内核源文件都有。那是什么? 问题答案: 它是指向当前进程(即发出系统调用的进程)的指针。 在x86上,它是在(其他拱门的类似文件)中定义的。 Linux设备驱动程序第2章中的更多信息: 当前指针是指当前正在执行的用户进程。在执行系统调用(例如打开或读取)期间,当前进程是调用该调用的进程。如果需要,内核代码可以通过使用curre

  • 问题内容: 在Linux中开发内核模块时,不允许使用C标准库。 但是,如果我需要使用某些常用功能,例如,我应该去哪里? 问题答案: 无论Linux内核中没有实现什么,您都必须实现自己或从另一个开源内核模块中借鉴。但是,您会发现它是在内核中实现的。 请参阅内核API文档。特别是关于您的一般问题的“ 基本C库函数”部分,以及有关的特定问题的“ 字符串处理”部分。 您将要包含。 我不知道为什么内核API

  • 问题内容: 在Linux内核源代码中,我找到了以下功能: 在这里我不明白这意味着什么。 问题答案:

  • 问题内容: 在不深入了解 为什么 的细节的情况下,我正在寻找一种干净的(尽可能)的方法来替换可加载模块中的内核函数和系统调用。我最初的想法是编写一些代码来覆盖某些功能,这些功能将采用原始功能(可能的话, 调用 该功能),然后添加一些自己的代码。关键是我编写的函数必须具有原始函数的名称,因此其他代码在尝试访问它时将改为访问我的函数。 通过将代码放入适当的函数中,我可以轻松地(相对地)直接在内核中执行