“current” in Linux kernel code

前端 未结 2 1583
一生所求
一生所求 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 07:59

    Here is the complete structure the "current" is pointing to

    task_struct
    Each task_struct data structure describes a process or task in the system.
    
    struct task_struct {
    /* these are hardcoded - don't touch */
      volatile long        state;          /* -1 unrunnable, 0 runnable, >0 stopped */
      long                 counter;
      long                 priority;
      unsigned             long signal;
      unsigned             long blocked;   /* bitmap of masked signals */
      unsigned             long flags;     /* per process flags, defined below */
      int errno;
      long                 debugreg[8];    /* Hardware debugging registers */
      struct exec_domain   *exec_domain;
    /* various fields */
      struct linux_binfmt  *binfmt;
      struct task_struct   *next_task, *prev_task;
      struct task_struct   *next_run,  *prev_run;
      unsigned long        saved_kernel_stack;
      unsigned long        kernel_stack_page;
      int                  exit_code, exit_signal;
      /* ??? */
      unsigned long        personality;
      int                  dumpable:1;
      int                  did_exec:1;
      int                  pid;
      int                  pgrp;
      int                  tty_old_pgrp;
      int                  session;
      /* boolean value for session group leader */
      int                  leader;
      int                  groups[NGROUPS];
      /* 
       * pointers to (original) parent process, youngest child, younger sibling,
       * older sibling, respectively.  (p->father can be replaced with 
       * p->p_pptr->pid)
       */
      struct task_struct   *p_opptr, *p_pptr, *p_cptr, 
                           *p_ysptr, *p_osptr;
      struct wait_queue    *wait_chldexit;  
      unsigned short       uid,euid,suid,fsuid;
      unsigned short       gid,egid,sgid,fsgid;
      unsigned long        timeout, policy, rt_priority;
      unsigned long        it_real_value, it_prof_value, it_virt_value;
      unsigned long        it_real_incr, it_prof_incr, it_virt_incr;
      struct timer_list    real_timer;
      long                 utime, stime, cutime, cstime, start_time;
    /* mm fault and swap info: this can arguably be seen as either
       mm-specific or thread-specific */
      unsigned long        min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;
      int swappable:1;
      unsigned long        swap_address;
      unsigned long        old_maj_flt;    /* old value of maj_flt */
      unsigned long        dec_flt;        /* page fault count of the last time */
      unsigned long        swap_cnt;       /* number of pages to swap on next pass */
    /* limits */
      struct rlimit        rlim[RLIM_NLIMITS];
      unsigned short       used_math;
      char                 comm[16];
    /* file system info */
      int                  link_count;
      struct tty_struct    *tty;           /* NULL if no tty */
    /* ipc stuff */
      struct sem_undo      *semundo;
      struct sem_queue     *semsleeping;
    /* ldt for this task - used by Wine.  If NULL, default_ldt is used */
      struct desc_struct *ldt;
    /* tss for this task */
      struct thread_struct tss;
    /* filesystem information */
      struct fs_struct     *fs;
    /* open file information */
      struct files_struct  *files;
    /* memory management info */
      struct mm_struct     *mm;
    /* signal handlers */
      struct signal_struct *sig;
    #ifdef __SMP__
      int                  processor;
      int                  last_processor;
      int                  lock_depth;     /* Lock depth. 
                                              We can context switch in and out
                                              of holding a syscall kernel lock... */  
    #endif   
    };
    
    0 讨论(0)
  • 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 <asm/current.h>, included by <linux/sched.h>. 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 <asm/current.h>. 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.

    0 讨论(0)
提交回复
热议问题