可以看出,current调用了current_thread_info函数,此函数的内核路径为:arch/arm/include/asm/thread_info.h,内核版本为2.6.32.65 static inline structthread_info*current_thread_info(void) { register unsigned longspasm("sp"); return(struct thread_info*)(sp & ~(THREAD_SIZE -1)); } 其中thread_info结构...
在linux内核中进程以及线程(多线程也是通过一组轻量级进程实现的)都是通过task_struct结构体来描述的,我们称它为进程描述符。而thread_info则是一个与进程描述符相关的小数据结构,它同进程的内核态栈stack存放在一个单独为进程分配的内存区域。由于这个内存区域同时保存了thread_info和stack,所以使用了联合体来定义,相...
struct task_struct *next_run,*prev_run:由进程的run_queue中产生作用的,指向上一个或下一个可运...
进程最常用的是进程描述符结构task_struct而不是thread_info结构的地址。为了获取当前CPU上运行进程的task_struct结构,内核提供了current宏,由于task_struct *task在thread_info的起始位置,该宏本质上等价于current_thread_info()->task,在include/asm-generic/current.h中定义: ...
struct task_struct *group_leader; pid(process ID)是任务的唯一标识符,每一个任务的 pid 都是不一样的。也就是说,如果一个进程有多个线程,那么这些多个线程所使用的 pid 也都是不一样的。 tgid(thread group ID),是线程组的 ID,一个进程中的所有线程的 tgid 都是一样的。如果一个进程,只有主线程,那么...
task_struct 是 Linux 中的进程描述符,是感知进程存在的唯一实体。Linux 内核中通过一个双向循环链表将...
struct list_head children; /* list of my children */ struct list_head sibling; /* linkage in my parent's children list */ struct task_struct *group_leader; /* threadgroup leader */ /* PID/PID hash table linkage. */ struct pid_link pids[PIDTYPE_MAX]; ...
但是较新的内核代码中,进程描述符task_struct结构中没有直接指向thread_info结构的指针,而是用一个void指针类型的成员表示,然后通过类型转换来访问thread_info结构。 相关代码在include/linux/sched.h中 #define task_thread_info(task) ((struct thread_info *)(task)->stack) ...
但是较新的内核代码中,进程描述符task_struct结构中没有直接指向thread_info结构的指针,而是用一个void指针类型的成员表示,然后通过类型转换来访问thread_info结构。 相关代码在include/linux/sched.h中 #define task_thread_info(task) ((struct thread_info *)(task)->stack) ...
内核将thread_info结构与内核态线程堆栈结合在一起,占据连续的两个页框,以便于访问线程描述符和栈。获取当前运行进程的thread_info可通过esp栈指针实现。thread_info结构包含task字段,指向进程控制块(task_struct)。task_struct结构体的flags字段用于记录进程标记或状态信息,如创建、超级用户、核心转储、...