打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
linux 线程的内核栈是独立的还是共享父进程的?
linux 线程有自己独立的内核栈吗?
首先,我们知道所有线程共享主线程的虚拟地址空间(current->mm指向同一个地址),且都有自己的用户态堆栈(共享父进程的地址空间,再在里面分配自己的独立栈,默认2M)。这是毫无疑问的,但还有一点我没搞明白,内核栈是共享还是独立的?
猜测:独立的。理由:要不然内核栈对应的thread_info中的tast_struct没有办法与每个线程对应起来,因为现在已经有多个task_struct了,但保存内核栈的thread_info(其实是thread_union联合体)中只能保存一个task_struct。所以理论上分析,虽然可以共享地址空间,但每个线程还是需要一个单独的内核栈的。看代码:
分析创建线程最终肯定会走到内核函数do_fork()中来的,所以从此函数看起。
do_fork()->copy_process()->dup_task_struct()
fork.c中dup_task_struct()的实现:
static struct task_struct *dup_task_struct(struct task_struct *orig)
{
struct task_struct *tsk;
struct thread_info *ti;
unsigned long *stackend;
int node = tsk_fork_get_node(orig);
int err;

tsk = alloc_task_struct_node(node);
if (!tsk)
return NULL;

ti = alloc_thread_info_node(tsk, node);/*就是这里,果然分配内核栈了*/
if (!ti)
goto free_tsk;

err = arch_dup_task_struct(tsk, orig);/*这里分配task_struct结构*/
if (err)
goto free_ti;

tsk->stack = ti;
        ...
}


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
对Linux的进程内核栈的认识
kthread_create和kernel_thread的区别和总结输入标题
Linux进程是如何创建出来的?
图说Linux进程
Linux内核态抢占机制分析
linux模块编程(二)——运行不息的内核线程kthread
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服