IPC 通信内核实现
IPC 通信内核实现
1:架构图
2:主要实现代码
struct task_struct {
.....
/* namespaces */
struct nsproxy *nsproxy;
}
struct nsproxy {
atomic_t count;
struct uts_namespace *uts_ns;
struct ipc_namespace *ipc_ns;
struct mnt_namespace *mnt_ns;
struct pid_namespace *pid_ns;
struct net *net_ns;
};
主要包含 uts,ipc,mmt,pid 与net,目前主要分析ipc通信,所以为ipc_namespace
struct ipc_namespace {
struct ipc_ids ids[3];//三种通信方式
}
#define IPC_SEM_IDS 0
#define IPC_MSG_IDS 1
#define IPC_SHM_IDS 2
//msg_ids消息队列,sem_ids信号量,shm_ids共享内存区
struct ipc_ids {
int in_use;
unsigned short seq;
unsigned short seq_max;
struct rw_semaphore rw_mutex;
struct idr ipcs_idr;
};
struct idr {
struct idr_layer __rcu *top;
struct idr_layer *id_free;
int layers; /* only valid without concurrent changes */
int id_free_cnt;
spinlock_t lock;
};
struct idr_layer {
unsigned long bitmap; /* A zero bit means "space here" */
struct idr_layer __rcu *ary[1<<IDR_BITS];
int count; /* When zero, we can release it */
int layer; /* distance from leaf */
struct rcu_head rcu_head;
};
通过 idr_layer,指针数组,通过传入的index(在通信过程中需要一个key值,相同的key值,得到同一个index,也就是指向kern_ipc_perm),指向kern_ipc_perm,
共享内存
struct shmid_kernel /* private to the kernel */
{
struct kern_ipc_perm shm_perm;
struct file * shm_file;
unsigned long shm_nattch;
unsigned long shm_segsz;
time_t shm_atim;
time_t shm_dtim;
time_t shm_ctim;
pid_t shm_cprid;
pid_t shm_lprid;
struct user_struct *mlock_user;
};
通过找到的struct kern_ipc_perm shm_perm;就可以找到file,然后找到共享的文件;ffile通过传入的key,size申请页
通过映射,创建页表,vm_area_struct的vm_file指向该file,完成内存映射
该图为详细说明,引用位置http://blog.51cto.com/desert/168855
实现架构图