tg-ch7-0.2.0-preview.2 is not a library.
第七章:进程间通信与信号
本章实现了进程间通信机制,包括管道和信号处理。
功能概述
- 信号 (Signal) 机制处理异步事件
- 用户自定义信号处理函数的注册与调用
- 信号屏蔽字管理,控制信号的接收
- 在系统调用返回前检查并处理待处理信号
- 管道 (Pipe) 实现进程间单向数据传递
- 文件、管道和标准输入输出都通过统一的文件描述符类型管理
用户程序加载
用户程序存储在 easy-fs 磁盘镜像中,内核启动时挂载文件系统,通过文件名从文件系统加载。
新增或更新的系统调用
| 系统调用 | 功能 |
|---|---|
pipe |
创建管道,返回读端和写端文件描述符 |
kill |
向指定进程发送信号 |
sigaction |
设置信号处理函数 |
sigprocmask |
设置信号屏蔽字 |
sigreturn |
从信号处理函数返回,恢复原执行流 |
read |
读取文件/管道/标准输入 |
write |
写入文件/管道/标准输出 |
信号处理
信号允许异步通知进程发生了某个事件。每个进程维护待处理信号集合和信号处理函数表。
本章内核在系统调用返回前检查并处理待处理信号。
match task.signal.handle_signals
管道
管道是一对文件描述符,一端写入、另一端读取,用于父子进程间通信:
管道由 tg-easy-fs 中的 make_pipe() 创建,内部使用环形缓冲区实现数据传递。
关键依赖:tg-signal 与 tg-signal-impl
信号机制由多个 crate 协作实现,依赖关系如下:
graph TD
tg-ch7 --> tg-signal-impl
tg-ch7 --> tg-signal
tg-ch7 --> tg-syscall
tg-signal-impl --> tg-signal
tg-signal --> tg-signal-defs
tg-syscall --> tg-signal-defs
tg-signal-defs --> numeric-enum-macro
- tg-signal-defs:信号基础定义(
SignalNo、SignalAction),依赖numeric-enum-macro生成枚举 - tg-signal:定义
Signaltrait 和SignalResult,重导出tg-signal-defs的类型 - tg-signal-impl:提供
Signaltrait 的参考实现SignalImpl - tg-syscall:系统调用定义,依赖
tg-signal-defs获取信号类型
进程通过 Box<dyn Signal> 持有信号处理器,支持 fork 时继承信号配置。
Dependencies
| 依赖 | 说明 |
|---|---|
virtio-drivers |
virtio 块设备驱动 |
xmas-elf |
ELF 文件解析 |
riscv |
RISC-V CSR 寄存器访问 |
tg-sbi |
SBI 调用封装库 |
tg-linker |
链接脚本生成、内核布局定位 |
tg-console |
控制台输出 (print!/println!) 和日志 |
tg-kernel-context |
用户上下文及异界传送门(启用 foreign feature) |
tg-kernel-alloc |
内核内存分配器 |
tg-kernel-vm |
虚拟内存管理 |
tg-syscall |
系统调用定义与分发 |
tg-task-manage |
进程管理框架(启用 proc feature) |
tg-easy-fs |
简单文件系统及管道实现 |
tg-signal |
信号模块定义 |
tg-signal-impl |
信号模块参考实现 |
Features
| Feature | 说明 |
|---|---|
nobios |
无需外部 SBI 实现,直接从 QEMU -bios none 模式启动 |
License
Licensed under either of MIT license or Apache License, Version 2.0 at your option.