Linux内核命名空间中关于pid管理的一些理解

本文探讨了Linux内核命名空间中PID管理的原理,指出在各自命名空间中,PID是唯一的,但全局不唯一。通过find_task_by_vpid函数连接PID到task_struct。介绍了struct pid_link、struct pid和struct upid结构,以及如何在命名空间中查找任务。重点阐述了find_task_by_vpid和find_task_by_pid_ns函数的作用。
摘要由CSDN通过智能技术生成

记得看《深入Linux内核架构》时,里面有讲到关于命名空间的概念,但是现在却基本上弯光了,唉。所以今天特意自己翻看一下内核4.2代码,整理一下命名空间中关于pid管理的部分,等什么时候有空了,再去翻看那本著作吧(写的比较乱〒_〒)。
命名空间的概念网上有很多,关于pid管理的话,大致思想应该就是各个task_struct的pid在各自的命名空间里面是唯一的,但是在全局不唯一。
通过一个函数find_task_by_vpid(pid_t vnr),就可以知道一个pid怎么联系到自己命名空间里面的task_struct结构体:

参数pid_t定义为(其实就是int):

27 typedef int             __kernel_pid_t;
21 typedef __kernel_pid_t          pid_t;

那么这个pid_t是放在哪的呢?

1344 struct task_struct {
......
1444         pid_t pid;
......
1474         struct pid_link pids[PIDTYPE_MAX];
......
}

其中,struct pid_link是一个很重要的结构,定义为:

69 struct pid_link
 70 {
 71         struct hlist_node node;
 72         struct pid *pid;
 73 };

struct pid_link的结构体成员struct pid定义则为:

 57 struct pid
 58 {
 59         atomic_t count;
 60         unsigned int level;
 61         /* lists of tasks that use this pid */
 62         struct hlist_head tasks[PIDTYPE_MAX];
 63         struct rcu_head rcu;
 64         struct upid numbers[1];
 65 }

该结构体成员struct upid定义为:


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值