1、pid_namespace结构主要的成员
pid_namespace实现了容器间pid资源的隔离,容器里面的进程只能看到容器内的pid信息,高层级的pidns可以看到低层级的pidns信息。
struct pid_namespace {
struct pidmap pidmap[PIDMAP_ENTRIES];
int last_pid;
struct kmem_cache *pid_cachep;
unsigned int level;
struct pid_namespace *parent;
};
pidmap用于分配pid号的位图变量
last_pid上一次分配的pid号
pid_cachep用于分配struct pid的slab缓存
Level 表示pidns的层级
Parent上一级的pidns
2、create_pid_namespace
fork函数创建子进程时带有标志位CLONE_NEWPID创建子进程自己的pidns。
fork
copy_process
copy_namespaces
copy_pid_ns
create_pid_namespace
struct pid在进程创建的时候都会通过task的pidns的pid_cachep的slab缓存中分配对象,pid_cachep的slab缓存的object的大小是 sizeof(struct pid) + (nr_ids - 1) * sizeof(struct upid),和进程的pidns所处的层级有关系。
struct pid最重要的成员变量就是numbers数组,它表示一个进程在每个namespace里的id,这里的id就是getpid()所得到的值。Numbers[0]表示最顶层的namespace,level=0,numbers[1]表示level=1的namespace,依此类推。在alloc_pid是从最底层依次从ns的pidmap位图变量中申请pid号。