Reed's News
← 返回精选

os8088:为 IBM PC/XT 打造的类 Mac 图形操作系统

Tech 65 jggonz 2026/8/8 2314 字 原文 ↗

os8088 1.0

专为IBM PC/XT打造的图形操作系统

这是一款为Intel 8086架构设计、仿Macintosh System 1风格的桌面系统,采用实模式汇编语言编写,通过软盘启动。它支持重叠窗口、下拉菜单、串口鼠标、可加载程序,以及抢占式多任务——这一特性连1984年的Macintosh都不具备。

  • 显示规格:
    • VGA模式:16色,640×480分辨率
    • Hercules模式:单色,720×348分辨率
    • CGA模式:单色,640×200分辨率
  • 内存要求:256KB
  • 内核大小:80,486字节
  • 抢占式任务数:12个
  • 调度频率:18.2Hz

os8088桌面:顶部是菜单栏,中间打开着记事本窗口(含输入文本)、计时时钟、弹跳小球窗口、显示抢占/协作模式选项的控制面板,以及带CPU历史图表的任务管理器——五个程序同时运行,底部停靠栏对应每个程序的图标

五个程序同时运行 从软件软盘加载的记事本、计时时钟、弹跳小球、控制面板和任务管理器,各自独立运行,在停靠栏拥有专属图标。任务管理器显示当前机器负载70%,已用内存147KB。

启动后几秒的闲置桌面 512字节的引导扇区完成内核加载并跳转执行。桌面会显示BIOS检测到的每个软盘驱动器图标,停靠栏为空——因为os8088启动时不会自动运行任何程序。

菜单仅在按住鼠标时保持打开 点击菜单栏,拖动选择菜单项,松开鼠标即可确认。由于没有屏幕备份用于恢复,下拉菜单覆盖区域的像素会被临时存入堆内存,菜单关闭后即释放该内存块。

拖动标题栏的中途状态 窗口尚未移动,仅以1像素空心轮廓在XOR模式下跟随指针移动。这种模式下,绘制与擦除操作完全相同——你可以看到轮廓穿过磁盘窗口标题文本时,文字会被反转显示。

同一程序的多个实例 一个磁盘窗口、两个时钟窗口和两个弹跳小球窗口,每个实例在系统实例表中都有独立记录,且同类实例依次向右下方偏移16像素层叠排列。每个实例对应一个停靠栏图标,图标的位置对应其在实例表中的槽位。

按键仅传递给最前端窗口 在模拟键盘输入两行文字,内容在窗口258像素宽的编辑区内自动换行,光标停留在最后一个字符后。每个记事本实例拥有独立的512字符缓冲区,只要堆内存足够,可同时打开任意多个实例。

关于窗口实时读取内核状态 第三行的“pre-emptive(抢占式)”字样,每次绘制窗口时都会从内核调度器字节读取最新状态,因此关于窗口、控制面板和任务管理器显示的调度模式始终保持一致。

历史图表填满的任务管理器 每9个时钟周期采样一次数据,存入160列的环形缓冲区,因此图表扫过整个窗口宽度约代表80秒的历史数据。没有独立任务的应用程序,其窗口回调的执行时间会在调度站点统计并计入自身负载,确保所有程序的负载占比总和为100%。

调度器设置直接读取内核状态 设置面板不会缓存调度器模式,每次绘制时都会读取内核的模式字节。点击“协作式”后,下一个时钟周期就会停止任务切换,无需重启或握手操作。

五个程序中的两个已最小化 时钟和弹跳小球通过标题栏的最小化按钮被送入停靠栏,其图标以反转样式显示,方便快速识别隐藏程序。最小化并非暂停——时钟仍在计时,只是停止绘制界面。

读取软件软盘的文件管理器 软件软盘挂载在B盘,显示每个文件的名称、大小和专属图标。图标直接取自磁盘:浏览器会读取每个文件的第一个扇区,程序包的16×16位图就存储于此,因此无需加载文件即可显示真实图标。

两个已加载程序,各占独立段 MINES和HELLO从同一张软盘加载,分别占用堆内存中的独立区域——大小为2048字节和512字节,且均在各自段内的0偏移地址运行,加载时无需任何补丁修改。

扫雷:1510字节,从软盘加载 双击MINES文件,它会被加载到独立段并打开窗口;此后其绘制、按键和点击处理程序,会以普通近偏移地址的形式被内核调用,与系统内置程序完全一致。扫雷界面是系统中唯一使用超过两种颜色的地方。

ArtfulType:Markdown编辑器 原是ActionRetro为经典68k架构Macintosh开发的写作应用,现重构适配8086平台。支持全屏写作模式与专属菜单栏,输入时实时应用格式,生成的纯Markdown文件可在其他任意平台打开。

Tracker:四声道MOD播放器 从软盘加载Amiga格式的.MOD文件即可播放:播放行随音乐滚动,四声道电平表同步跳动,播放时桌面仍可正常操作。

Paint:位图编辑器 提供铅笔、橡皮擦、填充、形状绘制、选区、取色器和文字工具,支持画布调整、撤销、剪贴板功能与16色模式,可读写BMP和GIF格式文件。

Fractal:曼德博集合探索工具 支持缩放、配色方案选择,通过三次迭代让图像逐渐清晰。它在后台绘制图像,渲染过程中桌面其他功能不受影响。

Piano:双八度键盘 可用鼠标或电脑按键演奏,演奏时音符会显示在上方乐谱中,乐谱也可回放。内置三首曲目,若机器有声卡则支持FM合成音效。

Recorder:采样录音机 支持录制、停止和播放,提供波形显示与内置演示音。机器有声卡时使用Sound Blaster,否则使用PC扬声器,状态栏会显示当前使用的设备。

Solitaire:克朗代克纸牌 从牌堆发牌,可在七列之间拖动单张或整串纸牌,从A开始向上搭建四组牌堆。拖动纸牌时显示轮廓,与窗口拖动方式相同。

Arkanoid:打砖块游戏 用方向键移动 paddle(挡板),清除六行砖块,跨关卡累计得分。小球由独立计时器驱动,无论系统其他任务如何运行,都能保持稳定速度。

扫雷:9×9棋盘,10颗地雷 点击格子打开区域,按F键切换标记模式,按N键开始新游戏。空区域可一键打开,且首次点击绝对安全——地雷会在你选择起始位置后才生成。

Note Pad:纯文本编辑器 支持自动换行、光标定位,通过系统文件对话框实现打开、保存和另存为功能。它将普通文件写入FAT12格式软盘,因此在这里编写的笔记可在现代电脑上打开。

Hello:显示两行文本的窗口 没有其他功能。它作为最小化可运行示例,供开发者参考;同时也是唯一不带图标的程序包,因此磁盘窗口会为它显示通用图标。

系统简介

os8088从软盘第一个扇区启动,进入图形桌面。它无需DOS底层支持,也没有任何命令行界面——512字节的引导扇区加载40KB内核,内核自动检测机器的显示适配器并切换到图形模式,调用显卡自带的8×8字符集,最终显示菜单栏。

后续操作完全复刻1984年Macintosh的交互逻辑:拖动标题栏移动窗口(显示橡皮筋式轮廓)、下拉并拖动选择菜单、关闭与最小化按钮、软盘驱动器图标、底部停靠栏(每个运行程序对应一个图标)。程序从第二张软盘加载,作为一等应用程序运行,支持同时运行多个实例。

整个系统可在Intel 8086或8088处理器(初代IBM PC和PC/XT的标配处理器)、256KB内存的机器上流畅运行。这是一个功能完备、可日常使用的业余项目,源码为实模式NASM汇编代码,借助AI辅助编写,托管在GitHub上。

技术参数

以下所有数据均来自实际编译结果。

项目 参数 说明
内核大小 80,486字节 包含调度器、窗口管理器、VGA驱动、鼠标驱动、音频层、文件管理器、加载器、任务管理器和控制面板全部功能
引导扇区 512字节 包含LBA转CHS地址翻译、BIOS软盘读取重试机制。若编译结果不为512字节则构建失败
段占用空间 55,355字节 代码加上内核通过DS段访问的所有缓冲区。必须适配64KB段大小——目前剩余10,181字节空间。任务栈、磁盘缓冲区和所有已加载程序均位于该段之外,不计入此数值
源码类型 实模式汇编 针对8086架构的NASM代码,AI辅助编写。无C语言代码、无链接器、无运行时库
显示支持 VGA、Hercules或CGA 启动时自动检测。VGA模式12h为16色640×480分辨率——含4个1位平面,每扫描线80字节;Hercules为720×348单色模式,CGA为640×200单色模式,两者均采用内存分页。三种模式均直接绘制到帧缓冲区
后台缓冲区 可选,默认关闭 屏幕的离线副本需占用153,600字节内存,超过256KB机器总内存的一半,因此这类机器始终直接绘制到显示器(与1984年Macintosh相同)。内存500KB及以上时,可通过控制面板开启后台缓冲区
任务槽位 12个,每个配1536字节栈 每个时钟窗口和弹跳小球窗口都是独立的抢占式任务
上下文切换频率 18.2065Hz PC标准定时器频率。每个时钟周期内,处理器会保存9个寄存器、切换栈指针,然后跳转到下一个程序执行——整个过程仅需约30条指令
可加载程序 各占独立段 程序包从第二张软盘加载到常规内存的独立区域——512KB机器约有107KB可用空间,640KB机器约233KB——支持同时驻留多个程序,关闭时自动释放内存
鼠标支持 1200波特率,7N1格式 COM1端口的微软串口鼠标,每次报告含3字节数据,由中断处理程序解码并绘制光标
目标硬件 IBM PC/XT,4.77MHz 8088处理器 256KB内存、串口鼠标,搭配VGA、Hercules或CGA显卡。界面重绘速度较慢,肉眼可见过程
指令集限制 仅支持8086指令集 通过cpu 8086-w+error参数强制限制,使用新指令会导致构建失败。严格遵循1978年的指令集标准

两个计时时钟和两个弹跳小球窗口同时运行,各自保持动画

无需程序主动协作 即使你在其他窗口输入内容,两个时钟仍会持续计时,两个小球仍会不断弹跳。定时器每秒触发18.2次中断,保存当前运行任务的状态,切换栈指针后跳转到下一个任务——整个过程仅约30条指令。同期的Macintosh不具备此功能:System 1一次只能运行一个应用,1987年推出的MultiFinder也仅支持协作式多任务。

记事本窗口保持不动,1像素矩形轮廓随鼠标拖动,随后窗口直接跳转到轮廓位置

窗口在松开鼠标前不会移动 1像素宽的XOR轮廓跟随指针移动,松开鼠标时才会重绘窗口。在4.77MHz的处理器上,每次鼠标事件都重绘整个窗口性能开销过大,这也是1984年Macintosh采用相同设计的原因。

磁盘文件管理器显示GAMES文件夹——包含MINES.O88、SOLITAIR.O88和ARKANOID.O88,各带专属图标——顶部打开着扫雷窗口,显示部分揭开的9×9棋盘,含彩色数字和红色标记

程序从第二张软盘加载 双击磁盘窗口中的文件,程序会被加载到独立段并作为原生应用运行。扫雷程序(含图标)仅1510字节。支持同时驻留多个程序包,或同一程序的多个实例。

任务管理器窗口:显示CPU使用率百分比、满屏的滚动历史图表、内存使用情况(639KB总内存,已用39KB),以及每个运行实例的状态和CPU占用率列表

系统状态实时监控 提供实时CPU仪表(带滚动历史图表)、内存读数,以及每个运行程序的单独统计行。无独立任务的应用程序,其窗口回调的执行时间会在调度站点统计并计入自身负载,确保所有程序的负载占比总和为100%。

实机运行测试

以上所有截图均来自模拟器。2026年8月,我们将磁盘镜像写入真实软盘,在三台同期机器上完成启动并拍摄照片——包括1981年IBM 5150、东芝T1100 Plus和一台286机型。

绿色荧光屏IBM 5151显示器显示os8088桌面,同时打开着记事本、关于窗口、时钟、任务管理器、扫雷棋盘和磁盘窗口

1981年IBM PC同时运行六个程序 搭载Hercules显卡的5150机器,分辨率720×348,从360KB软盘启动,记事本中输入了机器自身的硬件列表。照片由Elendilon拍摄,据反馈实机运行速度与模拟器几乎无差异。

历史背景

1985年2月,Digital Research公司为IBM PC推出GEM 1.0系统:一款仿Macintosh风格的桌面系统,支持重叠窗口和图标,可在标准XT硬件上运行。随后苹果公司提起诉讼,和解协议导致1986年发布的GEM Desktop 2.0移除了PC平台的重叠窗口和桌面图标——而不受协议约束的Atari ST版本则保留了这些特性。

PC平台曾短暂拥有这类图形界面,随后又失去了它。四十年后的今天,os8088从零开始重构了这一理念,适配同期硬件,还加入了GEM和同期Macintosh都不具备的抢占式多任务功能。

系统局限

  • 非DOS系统,不支持运行DOS程序:它无需DOS底层支持,从引导扇区开始完全接管硬件。
  • 无内存保护:8086架构本身不提供内存保护——所有程序与内核共享一个64KB段,这也是上下文切换成本极低、具备实用价值的原因。
  • 无文件句柄和随机访问功能:磁盘API仅支持整文件操作,包括写入、读取、删除和重命名。
  • 无网络功能。
  • 属于业余项目,而非商业产品,但功能完备,可满足日常使用需求。

体验方式

浏览器演示版可在模拟PC中启动软盘镜像——与写入真实磁盘的字节完全一致。若要自行运行,下载页面提供适用于同期硬件和86Box模拟器的360KB镜像,以及适用于QEMU的1.44MB镜像。