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


实现架构图



猜你喜欢

转载自blog.csdn.net/flyxiao28/article/details/80338451
今日推荐