katsusan / gowiki

0 stars 0 forks source link

linux process kernel stack #2

Open katsusan opened 4 years ago

katsusan commented 4 years ago

https://kernelnewbies.org/FAQ/current

When a thread needs to access the struct task_struct of its process, it first needs to locate its struct thread_info in the kernel stack and then follow its task field pointer which leads us in turn to the struct task_struct of the proces

struct thread_info {
    struct pcb_struct   pcb;        /* palcode state */

    struct task_struct  *task;      /* main task structure */
    unsigned int        flags;      /* low level flags */
    unsigned int        ieee_state; /* see fpu.h */

    mm_segment_t        addr_limit; /* thread address space */
    unsigned        cpu;        /* current CPU */
    int         preempt_count; /* 0 => preemptable, <0 => BUG */
    unsigned int        status;     /* thread-synchronous flags */

    int bpt_nsaved;
    unsigned long bpt_addr[2];      /* breakpoint handling  */
    unsigned int bpt_insn[2];
};

#define current (current_thread_info()->task)  //获取当前线程所在的进程task_struct

When this function executes, it executes on behalf of a thread that is trying to use the current global macro. As with any system call or trap to the kernel, the thread's kernel stack is used to hold the activation records for the function calls made while executing kernel code. This means that the local variable ti' is located on the kernel stack of the thread and its address is therefore within the kernel stack.