最小化内核
内核仅包含最核心的服务:内存管理、任务调度、IPC 通信。其他功能(驱动、文件系统、网络)运行在用户空间。
OpenOS 采用微内核架构,这是现代操作系统设计的一种方法。与宏内核(如 Linux)不同,微内核仅在内核空间运行最核心的服务,而将驱动和大部分系统服务放在用户空间运行。
最小化内核
内核仅包含最核心的服务:内存管理、任务调度、IPC 通信。其他功能(驱动、文件系统、网络)运行在用户空间。
故障隔离
用户空间的驱动崩溃不会导致内核崩溃。每个服务运行在独立的地址空间中,相互隔离。
最小可信计算基
内核代码量小,更容易进行形式化验证和安全审计。seL4 微内核已经过形式化验证。
灵活的服务组合
服务可以独立重启、升级和替换。系统可以根据需要动态组合不同的服务。
OpenOS 内核由以下核心模块组成:
arch/)| 模块 | 文件 | 职责 |
|---|---|---|
| GDT | gdt.rs | 全局描述符表,段选择子,TSS |
| IDT | interrupts.rs | 中断描述符表,异常和 IRQ 处理 |
| PIC | pic8259.rs | 可编程中断控制器初始化 |
| APIC | apic.rs | 高级可编程中断控制器 |
| IOAPIC | ioapic.rs | I/O APIC 控制器 |
| SYSCALL | syscall.rs | SYSCALL/SYSRET MSR 配置 |
| Per-CPU | percpu.rs | 每 CPU 数据区域 |
drivers/)| 驱动 | 文件 | 职责 |
|---|---|---|
| VGA | vga.rs | 帧缓冲文本渲染 |
| 串口 | serial.rs | UART 16550 驱动 |
| 键盘 | keyboard.rs | PS/2 键盘驱动 |
| PCI | pci.rs | PCI 总线枚举 |
| VirtIO-Net | virtio_net.rs | 网络设备驱动 |
| VirtIO-Block | virtio_block.rs | 块设备驱动 |
memory/)| 模块 | 文件 | 职责 |
|---|---|---|
| 堆分配器 | allocator.rs | linked_list_allocator |
| 帧分配器 | frame_alloc.rs | 物理帧分配 |
| 虚拟内存 | mod.rs | 页表管理,内存隔离 |
task/)| 模块 | 文件 | 职责 |
|---|---|---|
| 任务 | task.rs | TaskId,TaskState,SavedContext |
| 调度器 | scheduler.rs | 抢占式调度,SMP 支持 |
| 用户模式 | user.rs | Ring 3 切换,ELF 加载 |
handle.rs)| 模块 | 职责 |
|---|---|
| Handle | 64 位打包,Rights 位掩码 |
| HandleTable | BTreeMap 存储 |
ipc/)| 模块 | 职责 |
|---|---|
| Channel | 同步会合,消息传递 |
fs/)| 模块 | 文件 | 职责 |
|---|---|---|
| VFS | vfs.rs | 虚拟文件系统抽象,挂载点 |
| ramfs | ramfs.rs | 内存文件系统 |
| ext2 | ext2.rs | ext2 文件系统(读写) |
| 块缓存 | block_cache.rs | 块设备缓存 |
net/)| 模块 | 文件 | 职责 |
|---|---|---|
| DHCP | dhcp.rs | DHCP 客户端 |
| DNS | dns.rs | DNS 解析 |
| Socket | socket.rs | 套接字抽象 |
| TCP | tcp.rs | TCP 协议 |
| UDP | udp.rs | UDP 协议 |
sync.rs)| 模块 | 职责 |
|---|---|
| Spinlock | 自旋锁 |
| Mutex | 互斥锁 |
syscall/)| 模块 | 职责 |
|---|---|
| 分发器 | 54 个系统调用分发 |
| 编号 | 系统调用号常量 |
BIOS/UEFI → bootloader → kernel_main() │ ├─ 1. VGA 初始化 ├─ 2. 串口初始化 ├─ 3. 架构初始化 (GDT, IDT, APIC) ├─ 4. 内存初始化 (堆, 帧分配器) ├─ 5. 文件系统初始化 (VFS, ramfs, ext2) ├─ 6. 网络初始化 (VirtIO-Net) ├─ 7. 块设备初始化 (VirtIO-Block) ├─ 8. IPC 初始化 ├─ 9. Per-CPU 初始化 ├─ 10. 任务调度器初始化 ├─ 11. 挂载文件系统 (ramfs at /, ext2 at /disk) └─ 12. 启动用户空间服务OpenOS 实现 54 个系统调用:
| 类别 | 数量 | 编号范围 | 说明 |
|---|---|---|---|
| Channel | 5 | 0x01-0x05 | IPC 消息传递 |
| Handle | 3 | 0x10-0x12 | 能力管理 |
| Process | 7 | 0x30-0x36 | 进程生命周期 + 内存管理 |
| Thread | 3 | 0x40-0x42 | 线程管理 |
| Socket | 9 | 0xA0-0xA8 | 网络套接字 |
| 硬件访问 | 5 | 0xB0-0xB4 | 用户空间驱动支持 |
| 文件系统元数据 | 6 | 0xC0-0xC5 | 文件操作 |
| 事件 | 4 | 0xF2-0xFC | 事件信号 |
| 服务发现 | 2 | 0xF5-0xF6 | 端点注册/发现 |
| 文件系统 I/O | 5 | 0xF7-0xFF | 文件读写 |
| 网络 | 2 | 0xFD-0xFE | 网络 I/O |
| 调试 | 3 | 0xF0-0xF1, 0xF4 | 控制台 I/O |