2. Linux基础回顾
在 Linux 与 RTOS 多系统协同开发中,Linux 侧通常承担复杂业务、网络通信、文件存储与人机交互,而 RTOS 侧负责硬实时控制。理解 Linux 的进程、内存、文件系统、设备驱动与用户空间接口,是划分两侧职责、设计共享内存、RPMsg、RPMSG 或异构核间通信的基础。本节从协同开发视角回顾 Linux 的五个核心子系统。
一、进程管理:任务隔离与调度基础
Linux 用 task_struct 描述进程或线程,包含 PID、状态、调度策略、地址空间、文件描述符表、信号处理等。用户空间通过 fork()、exec()、clone() 创建任务,通过 wait() 回收子进程。调度器以 CFS 为主,实时任务可用 SCHED_FIFO 或 SCHED_RR。在多系统协同中,Linux 侧进程常作为“非实时管理者”,通过 /dev/rpmsg、共享内存或 socket 与 RTOS 通信。
ps -eLf # 查看进程与线程
top -H -p 1234 # 查看指定进程的线程
chrt -f 80 ./ctrl # 以 SCHED_FIFO 优先级 80 运行
taskset -c 2 ./app # 绑定到 CPU2
需要特别区分“进程隔离”与“线程共享”。进程拥有独立虚拟地址空间,线程共享同一地址空间。协同开发中,若 Linux 侧需要与 RTOS 共享大块数据,通常不会直接跨核共享虚拟地址,而是通过预留物理内存、mmap 映射到用户空间,再由核间中断或消息队列通知对方。
二、内存管理:虚拟地址、页表与映射
Linux 为每个进程提供独立虚拟地址空间,通过 MMU 和页表映射到物理内存。用户空间常用 malloc、mmap、brk 申请内存;内核空间使用 kmalloc、vmalloc、alloc_pages。协同开发中,共享内存通常由设备树预留 reserved-memory 区域,Linux 侧通过 mmap 映射,RTOS 侧直接访问同一物理地址。
cat /proc/meminfo
cat /proc/<pid>/maps
cat /proc/iomem
O_SYNC 或 MAP_SHARED,并在驱动中处理 cache 刷新与屏障。三、文件系统与设备模型
Linux 遵循“一切皆文件”思想。普通文件、目录、字符设备、块设备、socket、管道都可通过文件描述符访问。根文件系统常见 ext4、UBIFS、YAFFS2、squashfs;嵌入式场景常用只读 squashfs 加可写 overlay。设备驱动通过 /dev 节点暴露接口,用户空间用 open/read/write/ioctl/mmap 操作。
| 对象 | 用户空间接口 | 协同开发用途 |
|---|---|---|
| 字符设备 | open/read/write/ioctl | 控制 RTOS 核、发送命令 |
| 块设备 | read/write/mmap | 固件分区、日志存储 |
| sysfs | 文件读写 | 查看/配置设备状态 |
| procfs | 文件读写 | 查看进程、内存、中断 |
| 共享内存 | mmap | 大数据零拷贝传输 |
四、设备驱动与用户空间接口
Linux 驱动分为字符设备、块设备、网络设备三类。字符设备最常用于协同控制:驱动注册 file_operations,实现 open、release、read、write、unlocked_ioctl、mmap。用户空间通过 ioctl 传递命令与参数,通过 mmap 映射寄存器或共享缓冲区。
struct file_operations fops = {
.owner = THIS_MODULE,
.open = my_open,
.release = my_release,
.read = my_read,
.write = my_write,
.unlocked_ioctl = my_ioctl,
.mmap = my_mmap,
};
在异构多核系统中,常见做法是:Linux 侧编写一个字符设备驱动,负责与 RTOS 核通信;用户空间程序通过 /dev/rtos_ctrl 发送控制命令,通过 mmap 读写共享数据区。这样既保持用户空间接口简洁,又把核间协议细节封装在内核驱动中。
五、协同视角下的整体关系
下图展示 Linux 侧五大子系统与 RTOS 协同的典型关系:用户空间通过系统调用进入内核,内核驱动管理设备与共享内存,最终与 RTOS 核通过核间中断、共享内存或消息通道交互。
六、常见误区与复盘
- 误区一:把 Linux 当硬实时系统。 Linux 即使使用 PREEMPT_RT,也难保证亚微秒级抖动。硬实时控制应交给 RTOS,Linux 负责管理与通信。
- 误区二:跨核直接传虚拟地址。 两个系统的虚拟地址空间独立,必须传物理地址或通过共享内存映射。
- 误区三:忽略 cache 一致性。 共享内存若一侧有 cache、一侧无 cache,必须显式刷新或使用非缓存映射。
- 误区四:在用户空间直接操作寄存器。 应通过驱动
mmap或ioctl封装,避免权限与并发问题。