核心栈作用
可用来维护进程的一些信息
栈结构描述
Linux在栈底用一个数据结构指向slab中为之分配的task_struct,而这个数据结构正是结构体thread_info,它的一个成员是指向task_struct的指针。
为什么要是这种栈结构呢?
①把task_struct结构与内核栈放在一起的好处:内核中大部分处理进程的代码都是通过进程描述符进行的。
因而current宏查找到当前进程的描述符的速度就尤为重要。对于寄存器不富裕的体系结构来说,通过预先分配和重复使用task_struct可以避免动态分配和释放所带来的资源消耗,UNIX的一个特点就是创建进程迅速。
②thread_info结构体放栈底的好处:这样做是为了让那些像x86那样寄存器较少的硬件体系结构仅仅需通过栈指针就能计算出它的位置,而避免使用额外的寄存器专门记录
如何利用current里寻找task_struct的位置呢?
假设栈的大小为8k(13个二进制位),
current会将进程栈的地址的后13位屏蔽掉【换言之,current会利用栈指针esp,去掉esp末尾13位】,
这样得到的刚好就是进程栈的起始地址,而thread_info刚好就是位于进程栈的底部,所以进程栈的起始地址就是struct thread_info的地址,
这样current就得到了thread_info的地址,又因为thread_info是指向task_struct的结构体,这样我们就很容易找到task_struct的地址了。