“current” in Linux kernel code

前端 未结 2 1582
一生所求
一生所求 2020-12-31 07:55

As I was going through the below chunk of Linux char driver code, I found the structure pointer current in printk.

I want to know what stru

2条回答
  •  迷失自我
    2020-12-31 08:09

    It is a pointer to the current process ie, the process which has issued the system call.

    From the docs:

    The Current Process

    Although kernel modules don't execute sequentially as applications do, most actions performed by the kernel are related to a specific process. Kernel code can know the current process driving it by accessing the global item current, a pointer to struct task_struct, which as of version 2.4 of the kernel is declared in , included by . The current pointer refers to the user process currently executing. During the execution of a system call, such as open or read, the current process is the one that invoked the call. Kernel code can use process-specific information by using current, if it needs to do so. An example of this technique is presented in "Access Control on a Device File", in Chapter 5, "Enhanced Char Driver Operations".

    Actually, current is not properly a global variable any more, like it was in the first Linux kernels. The developers optimized access to the structure describing the current process by hiding it in the stack page. You can look at the details of current in . While the code you'll look at might seem hairy, we must keep in mind that Linux is an SMP-compliant system, and a global variable simply won't work when you are dealing with multiple CPUs. The details of the implementation remain hidden to other kernel subsystems though, and a device driver can just include and refer to the current process.

    From a module's point of view, current is just like the external reference printk. A module can refer to current wherever it sees fit. For example, the following statement prints the process ID and the command name of the current process by accessing certain fields in struct task_struct:

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

    The command name stored in current->comm is the base name of the program file that is being executed by the current process.

提交回复
热议问题