1.4MB的软盘,装得下整个操作系统,它居然真能上网。
x,x,x
我昨天下午三点十七分,在VMware里点开Menuet64的IMG文件,三秒后桌面就弹出来了。不是黑屏,不是报错,是带中文标题栏、带阴影的窗口,鼠标一拖就动,右下角还跳着实时时间。它没装系统,没进安装向导,也没要我选语言——它压根就不用装,插上就跑。

这东西不是模拟器,不是网页玩具,也不是Linux改个皮肤。它是实打实的x86-64汇编写的,从开机第一条指令开始就是它自己的代码。没有GCC,没有glibc,没有systemd,连printf都没地方调用。所有图标是手画的,所有字体是像素点阵,所有窗口阴影是用ADD和SHR算出来的。我试了点开MiniBrowser,输http://192.168.1.100,真刷出了我树莓派的nginx欢迎页。
我以前以为“国产操作系统”是新闻里的词,后来才知道,2002年就有人用汇编写完一个能连FTP、放MP3、打蜘蛛纸牌的完整桌面系统。作者叫Ville Mikael Turjanmaa,芬兰人,一个人干了十年。他没融资,没团队,没PR稿,官网到现在还是黑白文字配超链接,连个背景图都没有。下载页面写着:“Menuet64-095Q.IMG,762KB,SHA256: xxx”。

U盘启动试了三次才成功。第一次用Rufus直接写入,开机卡在黑屏;第二次发现得用GRUB4DOS,还得进BIOS把CSM打开;第三次才在老笔记本上跑起来。U盘插进去,按F12选中,停顿两秒,桌面就亮了。我打开文件管理器,看到根目录下有FD0、HD0、NET0三个盘符——FD0是软盘镜像本身,HD0是U盘,NET0是网卡。点开FD0,里面真有MENUET.TXT,用内置编辑器打开,第一行写着:“MenuetOS is a 32/64 bit operating system written in assembly language.”
它连USB键盘和鼠标都认。我换了三个键位布局,最终用GB2312输入法打了“你好”,字是宋体点阵,不模糊,不重影。中文路径也能进,比如建个叫“测试”的文件夹,再建个“文档.txt”,双击就能编辑。不是挂载Linux分区再套个翻译层,是所有路径解析、编码转换、字体渲染全在内核里用MOV和CMP搞定的。

联网比我想的简单,也比我想的难。在VirtualBox里,我一开始用NAT模式,DHCP一直拿不到IP。查了论坛才知道,VMware和VirtualBox对老式协议栈兼容不好,得换桥接模式,而且路由器得设静态ARP绑定。换完之后,ifconfig一敲,果然多了192.168.1.123。我立刻开FTP Server,用手机ES文件浏览器连进去,上传了一张PNG,桌面图标就变成了我那张图。
它甚至有VNC Viewer。我连上家里的Ubuntu虚拟机,桌面实时显示,拖动窗口没延迟。不是靠服务端压缩,是Menuet自己把RFB协议用汇编一行行解出来的。我还试了MIDI Player,放了一段《卡农》,声音有点薄,但节拍丝毫不乱。后来发现它用的是纯软件合成器,没调声卡驱动,全靠CPU算波形,每毫秒跑一次中断服务例程。

我翻了源码包里的makefile,总共不到12个ASM文件:kernel.asm、gui.asm、net.asm、fat.asm……每个文件平均2000行。最厚的是video.asm,5800行,全是显存操作和抗锯齿字体渲染算法。没用任何库,没include,所有函数名都是标号,比如@draw_window_shadow、@scroll_text_line。我试着改了一行,把默认背景色从0x1E改成0x0A,重新NASM编译,镜像只大了4字节。
有人说它不能运行微信、不能装Chrome,所以“不实用”。可我用它写了三篇日记,传到树莓派,又用FTP Server发给朋友;我用它抓了Wireshark导出的PCAP包,用内置十六进制查看器逐帧分析TCP握手;我甚至用它写了段小脚本,每分钟ping一次网关,超时就发个蜂鸣——用的是INT 0x1F,不是system()函数。

它没应用商店,没自动更新,没后台进程偷偷占内存。关机就是关机,重启就是断电重来。所有程序关掉就彻底消失,不留缓存、不留日志、不留注册表痕迹。桌面右下角那个小钟,时间来源是CMOS芯片,不是NTP服务器。我拔掉网线,它照样准。
我试过在物理机上跑。一台2008年的ThinkPad X61,拔掉硬盘,只插U盘,BIOS设成USB-FDD优先,开机——比Windows快,比Linux Live USB稳。插上USB摄像头,打开Webcam Server,手机扫二维码就能看实时画面。不是H.264推流,是原始YUV帧转JPEG再HTTP发送,CPU占用率恒定在32%。

它不教你怎么“写好业务逻辑”,它逼你去看CPU怎么读内存地址,看显卡怎么刷新扫描线,看网卡怎么填DMA缓冲区。我以前觉得“优化”是加缓存、换数据库,现在明白,真正快的系统,是连缓存都不想多申请一字节。
中文输入法里有个隐藏功能:按Ctrl+Alt+U,能调出Unicode码表,点一下就输出对应字符。我点了U+26A1,屏幕上跳出个闪电符号。旁边小字写着:“0x26A1 = thunderbolt, used in voltage regulation.”

菜单栏最右边有个小喇叭图标,点开是音量滑块,拖到底,系统就真的一点声音都没了。不是静音,是彻底关掉PIC中断8号。我试过在播放MP3时点它,音乐戛然而止,没缓冲,没残留,像拔了电源。
它没有“用户协议”,没有“隐私政策”,没问我要位置、通讯录、相册权限。第一次启动,它只问:“System time? [y/n]”,我按y,它就让我输入年月日时分秒,然后保存进CMOS。