Zeal 8-bit OS内存管理机制详解:16KB虚拟页、syscall与exec的底层奥秘

📅 2026/8/18 13:56:06
Zeal 8-bit OS内存管理机制详解:16KB虚拟页、syscall与exec的底层奥秘
Zeal 8-bit OS内存管理机制详解16KB虚拟页、syscall与exec的底层奥秘【免费下载链接】Zeal-8-bit-OSAn Operating System for Z80 computers, written in assembly项目地址: https://gitcode.com/gh_mirrors/ze/Zeal-8-bit-OSZeal 8-bit OS是一款专为Z80计算机设计、使用汇编语言编写的开源操作系统。对很多入门者来说最神秘的部分莫过于它的内存管理机制整个64KB地址空间被划分为4个16KB虚拟页内核与用户程序如何共处一室、syscall如何完成穿越、exec如何加载新程序背后都藏着精巧的设计。本文将以通俗的方式为你拆解Zeal 8-bit OS内存管理、syscall调用流程与exec执行机制的全部奥秘帮助你快速理解这颗Z80之心。Zeal 8-bit OS的16KB虚拟页内存布局Zeal 8-bit OS把64KB的地址空间划分为4个16KB虚拟页这一设计在头文件 kern_mmu_h.asm内联代码中有明确定义。各页的虚拟地址与用途如下表虚拟页地址范围用途Page 00x0000 - 0x3FFF内核代码禁止切换Page 10x4000 - 0x7FFF用户程序代码与数据Page 20x8000 - 0xBFFF用户程序可用RAMPage 30xC000 - 0xFFFF内核RAM与用户RAM动态切换这套布局的核心思想很简单内核占住第一页不动其余三页留给用户程序最后一页按需借给内核使用。更详细的官方说明见 docs/details/memory-mapping.md。内核保留页为何Page 0永远不能被切换Page 00x0000 - 0x3FFF存放的是内核代码本身它永远不能被切换。这意味着Zeal 8-bit OS的二进制体积被严格限制在16KB以内编译时不能超出用户程序运行时一旦触发 syscallCPU会跳转到第一页中的内核代码继续执行如果这一页被换成其他内容任何syscall、中断或与内核的通信都会导致未定义行为系统崩溃。这正是Zeal 8-bit OS用汇编手写内核的原因之一——把内核压进16KB是内存受限平台上的极致优化。用户程序的48KB地址空间当内核加载用户程序时Page 1、Page 2、Page 3三页都会被映射为可用RAM因此用户程序最大可达48KB3 × 16KB。关键细节如下所有用户程序必须从地址0x4000Page 1起点开始链接程序加载时栈指针SP被设置为0xFFFF栈顶在地址空间末端Page 3在用户态时归用户使用一旦发生 syscall 又会被换回内核RAM。syscall调用流程一次内存切换的穿越之旅syscall 是用户程序与内核通信的唯一通道。调用约定非常简洁系统调用号放入寄存器L参数按约定放入指定寄存器然后执行RST $08指令返回值放在寄存器A中。其核心处理函数是 kernel/syscalls.asm 中的zos_sys_perform_syscall整个流程堪称一次精巧的换页芭蕾保存用户当前Page 2的映射号先把内核RAM临时映射到Page 2保存用户Page 1/2/3的映射再把内核RAM正式映射回Page 3保存用户SP切换到内核栈通过系统调用表zos_syscalls_table跳转到对应处理例程处理完毕后恢复用户栈、还原三个用户页的映射返回用户程序。整个过程用户程序几乎无感知仿佛内核瞬移进来又瞬移出去。缓冲区不能跨越16KB页边界的秘密使用 syscall 时有一个硬性约束传给系统调用的缓冲区不能跨越16KB虚拟页边界。例如DE 0x4000大小0x4000✅ 正确缓冲区完整落在Page 1内DE 0x7FFF大小0x2❌ 错误缓冲区横跨Page 1与Page 2。原因在于当用户缓冲区恰好位于Page 3时内核在执行syscall期间会把该页换成内核RAM。为了解决这一冲突内核提供了zos_sys_remap_de_page_2/zos_sys_remap_bc_page_2例程把用户Page 3的内容临时映射到Page 2并将指针减去16KB0x4000让内核能安全访问用户数据。exec系统调用两种加载模式的底层差异exec是 Zeal 8-bit OS 中加载并执行新程序的系统调用编号16。由于是单任务系统它提供了两种模式实现在 kernel/loader.asm模式行为EXEC_OVERRIDE_PROGRAM新程序直接覆盖当前程序的地址空间不增加嵌套深度EXEC_PRESERVE_PROGRAM内核额外分配3页48KB存放新程序原程序保留新程序退出后自动恢复嵌套执行的深度由CONFIG_KERNEL_MAX_NESTED_PROGRAMS配置控制。例如深度为3时程序A可调用B、B可调用C但C只能通过覆盖模式再调用其他程序。每个程序占用3个页内核通过_page_owners数组记录每页的所有者加载时分配、退出时回收。重要提示子程序会继承父程序的已打开设备表、当前目录和CPU寄存器。因此程序退出前务必关闭自己打开的文件描述符否则会把未关闭的句柄留给父程序。无MMU模式no-MMU没有内存映射器也能运行并非所有Z80电脑都配备MMU。为此 Zeal 8-bit OS 提供了no-MMU模式见 kernel/loader_nommu.asm核心配置项只有两个KERNEL_STACK_ADDR内核RAM区域的结束地址也是内核栈底KERNEL_RAM_START内核RAM栈变量驱动数据的起始地址。该模式下用户程序的栈指针被设置为KERNEL_RAM_START - 1程序可通过SP - 0x4000计算自己的可用内存大小。官方建议内核RAM至少分配3KB约1KB的BSS 1KB栈 余量即可安全运行。总结Zeal 8-bit OS内存管理的设计智慧回顾全文Zeal 8-bit OS的内存管理机制可以用三个关键词概括16KB虚拟页、syscall换页、exec嵌套。内核以16KB为粒度管理地址空间用换页实现用户态与内核态的无缝切换用覆盖/保留两种模式平衡单任务系统的灵活性与资源占用。对于想深入学习的朋友推荐直接阅读以下源码文件体验汇编级操作系统的精妙之处官方内存映射文档docs/details/memory-mapping.mdsyscall完整说明docs/details/syscalls.md虚拟页常量与宏include/kern_mmu_h.asm程序加载器实现kernel/loader.asm、kernel/loader_nommu.asmsyscall分发与换页例程kernel/syscalls.asm希望这篇Zeal 8-bit OS内存管理机制详解能帮你打通从看热闹到看门道的最后一公里。动手编译一次、读一遍汇编源码你会真正体会到在8位机上写操作系统的那份纯粹乐趣【免费下载链接】Zeal-8-bit-OSAn Operating System for Z80 computers, written in assembly项目地址: https://gitcode.com/gh_mirrors/ze/Zeal-8-bit-OS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考