2026/8/18 15:02:07

Zeal 8-bit OS系统调用终极指南:25+个API逐一详解与调用技巧

Zeal 8-bit OS系统调用终极指南:25+个API逐一详解与调用技巧 Zeal 8-bit OS系统调用终极指南25个API逐一详解与调用技巧【免费下载链接】Zeal-8-bit-OSAn Operating System for Z80 computers, written in assembly项目地址: https://gitcode.com/gh_mirrors/ze/Zeal-8-bit-OS如果你正在为 Z80 计算机开发软件那么Zeal 8-bit OS 系统调用Syscall就是你与操作系统内核打交道的唯一官方通道。Zeal 8-bit OS 是一款完全用 Z80 汇编语言编写的轻量级操作系统内核代码不到 8KB却提供了 27 个功能完整的系统调用 API覆盖文件读写、目录操作、进程管理、时间日期与内存映射。本文将逐一详解全部Zeal 8-bit OS API并分享新手最容易踩坑的调用技巧帮你快速写出稳定高效的用户程序。什么是 Zeal 8-bit OS 系统调用系统调用是用户程序请求内核执行特权操作的机制。Zeal 8-bit OS 借鉴了 Linux 与 CP/M 的设计思路把打开文件读取键盘映射内存等硬件相关操作全部抽象成统一接口用户程序只需把调用号放入 L 寄存器、参数放入指定寄存器然后执行一条RST $08指令即可进入内核。调用完成后返回值统一放在A 寄存器中0表示成功非0则是错误码。完整系统调用表可查看文档docs/system-calls.md与docs/details/syscalls.md内核分发逻辑位于kernel/syscalls.asm调用号常量定义在include/syscalls_h.asm。调用约定的核心规则项目约定调用号存入寄存器L如ld l, 2表示 open参数按规则放入H、DE、BC、A等寄存器触发指令RST $08返回值A寄存器0 为成功次要返回值如BC读写的字节数、DE时间值等⚠️最重要的限制传给系统调用的任何缓冲区都不能跨越 16KB 虚拟页边界例如缓冲区起点在0x7FFF、长度为 2 字节就会跨越页 1 和页 2 而报错。遇到大缓冲区请分多次调用。文件操作类系统调用读写文件的六个核心 API文件操作是使用频率最高的系统调用组包括read、write、open、close、seek、dstat、stat共 7 个 API。open#2打开文件或驱动open接受文件路径存于BC和标志位存于H成功返回描述符。路径支持三种写法相对路径file.txt、当前磁盘绝对路径/dir/file.txt、跨磁盘绝对路径C:/dir/file.txt。常用标志位定义在头文件kernel_headers/sdcc/include/zos_vfs.h中O_RDONLY0只读、O_WRONLY1只写、O_RDWR2读写O_TRUNC打开即清空文件O_APPEND每次写入前自动移动游标到文件末尾O_CREAT文件不存在时创建O_NONBLOCK非阻塞模式仅对驱动有效小技巧打开驱动而非文件时名称必须以#开头且不超过 4 个字符例如#SER0。read#0与 write#1数据搬运readH描述符DE缓冲区BC字节数返回时BC实际读取字节数。write参数完全相同只是方向相反。标准输出DEV_STDOUT0和标准输入DEV_STDIN1也通过它们读写。close#3及时释放资源关闭描述符。内核能同时打开的文件/驱动数量有限用完务必立即关闭否则后续open可能失败。注意程序退出时内核会自动关闭其打开的所有设备并重置标准输入输出。seek#6移动文件游标H描述符BCDE32 位偏移量A基准位置。基准值有三种SEEK_SET0从文件头、SEEK_CUR1相对当前位置、SEEK_END2相对文件末尾。偏移量超出文件大小时游标会被钳制到文件末尾。dstat#4与 stat#5获取文件信息dstat针对已打开的描述符Hstat针对文件路径BC两者都把结果写入DE指向的结构体包含文件标志、32 位大小、日期和名称。目录与路径操作六个目录系统调用详解Zeal 8-bit OS 支持真正的目录树取决于文件系统相关 API 共 6 个。mkdir#8创建目录路径存入DE。路径中任何一级不存在都会失败。chdir#9切换当前工作目录路径存入DE。curdir#10把当前工作目录写入DE指向的缓冲区缓冲区至少要PATH_MAX128字节。opendir#11打开目录DE路径成功返回描述符。readdir#12读取目录下一个条目H目录描述符DE缓冲区。返回ERR_NO_MORE_ENTRIES21表示条目已读完。rm#13删除文件或空目录路径存入DE。目录条目结构为 1 字节标志 16 字节文件名可用D_ISFILE/D_ISDIR宏判断类型。进程管理exec 与 exit 的进阶玩法Zeal 8-bit OS 是单任务系统但通过exec可以加载并运行子程序形成嵌套执行树。exec#16加载并执行程序BC程序路径DE字符串参数可空H执行模式EXEC_OVERRIDE_PROGRAM0子程序直接覆盖当前程序节省内存。EXEC_PRESERVE_PROGRAM1当前程序保留在 RAM需额外 48KB子程序退出后自动恢复执行。注意子程序会继承父程序打开的全部描述符、当前目录和寄存器因此子程序退出前必须关闭自己打开的描述符否则会泄漏给父程序。嵌套深度由menuconfig的CONFIG_KERNEL_MAX_NESTED_PROGRAMS决定。exit#15退出并返回内核H退出码退出后内核重新加载init.bin。若当前程序是被EXEC_PRESERVE_PROGRAM调起的子程序则父程序会收到退出码存于D。描述符技巧dup 与 swap 重定向输入输出dup#17把描述符H复制到新编号E两个描述符共享同一个游标。注意新编号必须是空的。swap#24交换描述符H和E的指向非常适合临时重定向标准输出用完再换回来比 dup 更干净。这两个 API 是编写输出重定向类程序如把命令结果写入文件的关键工具。设备控制ioctl 与 mountioctl#7对驱动执行控制命令。H驱动描述符C命令号DE16 位参数。命令含义由具体驱动定义例如控制串口波特率、键盘 LED 等。mount#14挂载磁盘。H磁盘驱动描述符D盘符A~Z大小写均可E文件系统类型。系统最多支持 26 个磁盘盘符 A 是系统默认盘。时间与日期五个时间系统调用msleep#18休眠指定毫秒数DE时长最大 65 秒。settime#19/ gettime#20设置/读取毫秒计数器DE返回当前值。精度依赖硬件实现可能是 1ms、16ms 等编程时不要假设固定粒度。setdate#21/ getdate#22设置/读取系统日期DE指向 8 字节日期结构年、月、日、星期、时、分、秒BCD 格式结构定义见kernel_headers/sdcc/include/zos_time.h。无 RTC 的平台上日期相关调用会返回ERR_NOT_IMPLEMENTED2。内存管理MMU 专属的三个系统调用仅当内核启用 MMU内存管理单元时可用map#23把物理地址HBC映射到虚拟地址DE地址会自动向下取整到 16KB 页边界。这是访问扩展内存、驱动帧缓冲的核心 API。palloc#25分配一页 16KB RAM返回页索引存于B。pfree#26释放先前分配的页只能释放自己分配的内存页。完整系统调用一览表编号名称一句话功能0read从描述符读取数据1write向描述符写入数据2open打开文件或驱动3close关闭描述符4dstat获取描述符统计信息5stat获取文件统计信息6seek移动文件游标7ioctl对驱动执行控制命令8mkdir创建目录9chdir切换当前目录10curdir获取当前目录11opendir打开目录12readdir读取目录条目13rm删除文件或空目录14mount挂载磁盘15exit退出程序16exec加载并执行程序17dup复制描述符18msleep休眠毫秒19settime设置时间计数器20gettime读取时间计数器21setdate设置系统日期22getdate读取系统日期23map物理地址映射到虚拟地址24swap交换两个描述符25palloc分配一页内存26pfree释放一页内存实战用系统调用实现 echo 命令来看内核自带的最小示例——romdisk/init/echo.asm它演示了write的标准用法; HL ARGVBC ARGC call strlen ; 计算参数字符串长度结果在 BC ex de, hl ; DE 指向字符串地址 S_WRITE1(DEV_STDOUT) ; 把字符串写到标准输出 S_WRITE3(DEV_STDOUT, newline, 1) ; 再输出一个换行 xor a ; 返回 0 表示成功 ret其中S_WRITE1、S_WRITE3是头文件kernel_headers/z88dk-z80asm/zos_sys.asm提供的宏会自动设置调用号并执行RST $08比手写寄存器更不易出错。如果你用 C 语言SDCC 4.2开发可以直接调用kernel_headers/sdcc/include/下的zos_vfs.h、zos_sys.h中的函数。错误码速查调试必备失败时A返回的错误码定义在include/errors_h.asm常用几个务必记住ERR_SUCCESS0成功ERR_NOT_IMPLEMENTED2目标不支持该功能ERR_NO_SUCH_ENTRY4文件/目录不存在ERR_INVALID_PARAMETER6参数非法ERR_NO_MORE_ENTRIES21目录条目已读完ERR_NO_MORE_MEMORY22内存不足总结Zeal 8-bit OS 的 27 个系统调用 API 覆盖了 8 位机上开发所需的一切文件、目录、进程、设备、时间、内存。牢记三条黄金法则即可少踩 90% 的坑缓冲区不要跨 16KB 页边界、用完立即 close、子程序退出前清干净自己打开的描述符。现在就去kernel_headers/examples/目录下的示例程序里动手试试吧【免费下载链接】Zeal-8-bit-OSAn Operating System for Z80 computers, written in assembly项目地址: https://gitcode.com/gh_mirrors/ze/Zeal-8-bit-OS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考