Linux进程核心栈结构剖析

核心栈作用

可用来维护进程的一些信息

栈结构描述

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的地址了。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值