记得看《深入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定义为: