QNX学习笔记——IPC(5)

来源:互联网 发布:h5响应式建站系统源码 编辑:程序博客网 时间:2024/06/08 12:40
  读QNX_Neutrino_RTOS_Architecture的IPC章最后一节Typed memory。
      既然Typed memory既然是放在InterProcess一章,那么Typed meomory可以是一个特殊的多进程共享的内存。
      QNX主要提供了两个接口posix_typed_mem_open和posix_typed_mem_get_info.通过posix_typed_mem_open获取指向一块物理内存的描述符,然后通过mmap建立存储映射。
      文中虽然提到POSIX typed memory的含义,但个人仍然不很明白,我目前的理解是将物理内存(数据部分)进行分类管理,根据类型将物理内存划分成层级结构,通常可以由系统分配类型内存的一块给进程使用,也可以获取直接内存映射。这似乎与进程通信没有任何关系。
      类型存储对象是在系统页的asinfo段规定的,在启动时,类型存储对象与asinfo的地址空间层级结构进行了映射。其中memory,ram,sysram是强制存在的入口。sysram在匿名参数mmap和malloc中调用分配。
      mmap对类型内存映射存在两种方式,其中之一是ALLOCATE_CONFIG和ALLOCATE的方式,另一为ALLOCATABLE的方式。ALLOCATE_CONFIG的方式是类似于MAP_ANON|MAP_SHARED的方式,都是由系统间接分配,而ALLOCATABLE的方式可以直接映射到物理内存,不需要分配和回收。通过Typed memory,DMA可以映射至任何物理内存。如果自己添加typed memory,在QNX下,需要在初始化时通过as_add进行添加配置。
      对于访问权限可以在系统boot-up时定义。默认情况,仅仅root用户对类型存储对象拥有读写权限。只有标记flag配置为ALLOCATABLE的方式,mmap的offset参数才有意义,当flag配置为ALLOCATE_CONFIG offset不为0则报错。
      管道PIPE和FIFO是另外一种进程通信方式,只不过消息传递的方式为双向的,而PIPE是单向的。FIFO是一种输入端写死的特殊PIPE。