另外从之前的图可以看到,thread_info和stack处于同一地址空间,且thread_info在这段地址空间的最低地址处,而且这个地址空间是以THREAD_SIZE对齐的,所以只要将stack地址的最低N位变为0,即可得到thread_info的地址(2^N=THREAD_SIZE) 例如当THREAD_SZIE=8K时,systemd的thread_info地址就等于0xffff88007c894000&(~(0x...
在linux内核中进程以及线程(多线程也是通过一组轻量级进程实现的)都是通过task_struct结构体来描述的,我们称它为进程描述符。而thread_info则是一个与进程描述符相关的小数据结构,它同进程的内核态栈stack存放在一个单独为进程分配的内存区域。由于这个内存区域同时保存了thread_info和stack,所以使用了联合体来定义,相...
进程最常用的是进程描述符结构task_struct而不是thread_info结构的地址。为了获取当前CPU上运行进程的task_struct结构,内核提供了current宏,由于task_struct *task在thread_info的起始位置,该宏本质上等价于current_thread_info()->task,在include/asm-generic/current.h中定义: ...
struct thread_info{struct task_struct*task;/* main task structure */__u32 flags;/* low level flags */__u32 status;/* thread synchronous flags */__u32 cpu;/* current CPU */mm_segment_t addr_limit;unsigned int sig_on_uaccess_error:1;unsigned int uaccess_err:1;/* uaccess failed...
union thread_union { #ifndef CONFIG_ARCH_TASK_STRUCT_ON_STACK struct task_struct task; #endif #ifndef CONFIG_THREAD_INFO_IN_TASK struct thread_info thread_info; #endif unsigned long stack[THREAD_SIZE/sizeof(long)]; }; 另一个结构 pt_regs,定义如下。其中,32 位和 64 位的定义不一样。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。上下文数据:进程执行时...
内核栈的结构如下所示,首先是预留的8个字节,然后是存储寄存器,最后存储thread_info结构体。 这个结构是对 task_struct 结构的补充。因为 task_struct 结构庞大但是通用,不同的体系结构就需要保存不同的东西,所以往往与体系结构有关的,都放在 thread_info 里面。在内核代码里面采用一个 union将thread_info和stack 放在...
二、分配进程描述符(struct thread_info) Linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色(cache coloring) 的目的(通过预先分配和重复使用task_sturct,可以避免动态分配和释放所带来的资源消耗) 进程描述符的分配: ...
内核将thread_info结构与内核态线程堆栈结合在一起,占据连续的两个页框,以便于访问线程描述符和栈。获取当前运行进程的thread_info可通过esp栈指针实现。thread_info结构包含task字段,指向进程控制块(task_struct)。task_struct结构体的flags字段用于记录进程标记或状态信息,如创建、超级用户、核心转储、...
thread_info是体系结构相关的,结构的定义在thread_info.h中 Linux内核中使用一个联合体来表示一个进程的线程描述符和内核栈: union thread_union { struct thread_info thread_info; unsigned long stack[THREAD_SIZE/sizeof(long)]; }; 获取当前在CPU上正在运行进程的thread_info ...