Linux进程通信方式
- 管道:创建的时候分配一个页大小内存,空间有限,不适合大量数据传输。
- 消息队列:有两次copy造成额外的CPU消耗,不适合大量信息传输,效率比较低。
- 共享内存:多个进程共享一块内存,没有同步机制,需要自己实现同步机制。
- 套接字:在单机的情况下面走网络传输效率低。
- 信号量:是一种锁机制,方式多个进程访问同一个资源,是一种同步手段。
- 信号:不适合数据传输。
Android会什么会实现IPC Binder机制
- 耦合性:C/S架构,不是网络通信,而是Binder机制。C和S是独立的。
- 安全角度:Android是开放操作系统,保护每一个进程之间信息的安全。
- 开发角度:在IPC中是C和C++,安卓使用Java,对组件进行Java的封装。
如何自己开发一个内核模块
bash
make # 编译出模块
insmod xxx.ko # 将模块插入内核
lsmod # 查看模块
mknod /dev/mychannel c 96 0 # 创建设备文件 字符模块 主设备号 次设备号
# 启动进程
模块开发
什么是主次设备号
每一个设备都有一个设备号,字符模块有一个字符模块的ID就是设备号;一个主设备号可以有多多个次设备号
private_data
设备文件的私有空间,可以被poll感知到。
insmod时候调用Init
- 注册设备
- 初始化设备
- 添加到内核
- 初始化private_data
channel_open
- 检查设备是否对应
- 将分配好的空间指向
private_data
channel_read
- 有数据时读取对应长度的数据
- 没有数据等待数据写入唤醒
channel_write
- 通过最大长度判断数据是否可以写入private_data
- 写入数据唤醒io多路复用的read(channel_read)
channel_poll
- 初始化
- 控制标志位
下一节具体实现这个通信组件。