起因

前两篇整理了现代 UEFI 平台的真实工作方式,讲清楚了固件自己怎么跑起来、GOP/PCIe/NVMe 这些设备怎么被固件认出来。写完之后决定往前走一步:把这套认知真正落地成一个能用的东西——从 UEFI 到内核全部自己写的线切割机工业控制系统。这个系列从这篇开始,记录整个项目从立项到落地的技术决策和实现细节。

先把这台机器的出身交代清楚。电火花加工是苏联的拉扎连科夫妇 1943 年前后研究电腐蚀现象时捣鼓出来的——电极和工件之间灌脉冲放电,靠一个个放电坑把金属蚀掉,不挑硬度,淬过火的钢照样切。线切割是这支家族里把成型电极换成一根移动丝的变体:丝便宜、损耗可以用轨迹补偿找回来,配上数控什么形状都能走。往复走丝的快走丝体系是国内自成一派的路子——钼丝来回用、机床便宜、维护皮实,吃下了国内的模具和五金市场;中走丝则是 2000 年代在快走丝机床上叠加多次切割、把精度往慢走丝方向逼出来的品类。这个项目的目标机器,就是中走丝。这段的完整家谱见背景篇:电火花线切割的来历

早期做中走丝这个行业,市面上能看到的控制系统方案基本分三类,各自都依托在别人的第三方系统上,也各自带着别人系统的包袱:

  • DOS 系统方案(如 HF WEDM):优点是简单直接、贴近硬件,但代价是被硬件迭代反过来卡住——只能跑在老主板上,现代硬件(NVMe、USB、新显卡)DOS 时代的驱动模型根本认不出来,机器坏了配件难找;FAT16/640KB 这类历史限制让存储和内存捉襟见肘;DOS 没有真正的多任务,想加联网传程序、实时监控这类功能,只能靠取巧的中断钩子硬塞进主控制循环里,界面也停留在字符/简陋图形的代际水平。
  • Windows 系统方案(如 AutoCut):技术是现代的,但代价是不受自己控制——Windows 不是实时内核,后台服务、杀毒软件都可能挤占 CPU 时间片,造成脉冲放电和运动控制时序的偶发抖动,这对高频放电控制是致命的不确定性;系统更新可能改变驱动模型或安全策略,跑了多年的专用 PCIe 卡驱动可能突然失效,机床厂商被迫跟着微软的更新节奏被动升级;自制硬件驱动想在新版 Windows 上跑还要过驱动签名这道门槛;一旦蓝屏或系统崩溃,直接等于停产。
  • Linux + Qt 系统方案:想兼顾开源和现代图形界面,但代价是仍然带着通用 OS 的复杂度——标准 Linux 内核本身不是硬实时的,想要硬实时保证需要 PREEMPT_RT 这类补丁,维护和长期支持的确定性都要打问号;Qt 的商业授权是隐性的法律成本,GPL/LGPL 版本用在商业机床产品上要仔细处理许可证边界;systemd、包管理、安全补丁节奏这些通用 Linux 系统自带的东西,对一台专用机床控制系统来说都是不必要的复杂度和攻击面。

除了这些技术层面的痛点,还有一层商业上的限制:设备如果卖到国外一些地区,用 Windows 这类美国原产系统,理论上要考虑美国出口管制体系的域外适用问题——即便产品本身卖到第三国,只要含有美国原产技术成分,仍可能被纳入管辖范围。这不是技术问题,是商业出海要提前考虑的合规风险,也是选择完全自研、不依赖任何第三方系统的现实考量之一。

国际头部厂商在高端机型上走的也是类似的路子——比如慢走丝领域的 Sodick,自家机床用的是专门为其直线电机驱动系统开发的"Sodick Motion Controller Technology(K-SMC)"(Sodick Motion Control),核心控制层不依赖通用第三方方案。这也从另一个角度印证:高端设备的控制精度、可靠性和商业自主权要求,走到一定阶段,自研核心控制系统不是可选项,是必选项。

这三条路线分别代表"老技术、简单,但受硬件限制"(DOS)、“现代技术,但复杂、受制于第三方节奏”(Windows)、“开源现代,但仍带着通用 OS 的复杂度和授权问题”(Linux+Qt)。这个项目想要的是三者都没做到的组合:用现代硬件和现代技术栈,做一个不受任何第三方系统架构和商业节奏限制、同时保持足够简单的工业操作系统。不装通用 OS,直接在 UEFI 固件之上跑一个为这台机床量身定制的专用系统,没有闲置的驱动、没有不需要的兼容层,控制逻辑离硬件只隔一层自己写的代码。

一、为什么是 Rust,不是传统的 C

裸机/驱动开发的传统选择是 C,这也是 OSDev 社区几十年经验积累、几乎所有硬件厂商参考驱动代码的语言。选 Rust 走这条路,图的是编译期的内存安全保证——缓冲区溢出、悬垂指针、数据竞争这类问题,在 C 里完全依赖人的自觉和 review,而这些 bug 一旦出现在控制线切割机走丝、放电脉冲这类逻辑里,后果不是"程序崩溃重启"这么轻,可能是撞刀、断丝甚至设备损坏。Rust 把这一整类风险在编译期就挡掉了,这跟工业控制"出错代价高"的属性正好对上。

代价也要说清楚:Rust 在 UEFI/裸机这个细分领域的生态还年轻,能直接拿来用的库很少,大部分驱动级的东西都要自己动手实现,下一节展开说。

二、依赖策略:为什么零 Cargo 外部依赖,全部 vendor 进仓库

工业控制系统的一个现实约束是生命周期长,十几年起步。这个约束直接否定了"正常项目"里习惯的做法——把 uefi-rsxhcinvme 这类第三方 crate 写进 Cargo.toml,靠 crates.io 长期在线来保证能编译。十年后这些库的作者可能早就不维护了,Rust 编译器版本迭代几轮之后,不维护的库大概率过不了新工具链的编译,到时候想升级 Rust 版本、修一个安全漏洞,可能被一个自己不掌控的依赖卡住。

这个项目采用的策略是:参考开源实现,但代码全部搬进自己的仓库,不作为 Cargo 依赖挂在外面。具体分两层:

  • UEFI 固件对接这一层:UEFI/PI 规范本身是稳定发布的行业标准,硬件厂商长期兼容,这个基准不会消失。所以这一层直接手写或参考 r-efi 这类几乎不做封装的原始 FFI 绑定,本质上是把规范里的结构体定义翻译成 Rust 代码,复制进仓库,不依赖外部维护节奏。
  • ExitBootServices() 之后的所有代码:PCIe 枚举、USB 驱动、NVMe 驱动、exFAT 文件系统、图形界面、控制逻辑,全部自己实现。会参考 uefi-rsxhciobhq/exfat、Redox/Theseus 这些开源项目的实现思路,但落地方式是读懂之后重写进自己的代码库,不是加一行依赖。

这里有个容易忽略的点:参考开源代码要过一道许可证检查。MIT/Apache-2.0 这类宽松许可证可以放心参考改写;GPL/LGPL 这类传染性许可证如果直接照抄进商业产品,可能被要求连自己的系统也要开源,这对要卖钱的工控产品是不能接受的后果。上面提到的几个参考项目基本都是 MIT/Apache-2.0,风险可控,但每引入一段参考代码之前都会单独确认许可证类型。

三、专用系统,不是通用 OS——这个定位决定了工程量的上限

另一个关键决策:这套系统只服务于这台线切割机,不追求驱动"现代电脑硬件"这种通用能力。通用操作系统要考虑未来可能接入的任意硬件组合,专用工控系统只需要考虑这台机器实际配的这一组硬件。这个定位把工程量砍掉了一大截——不用适配任意主板的任意 APIC 拓扑,不用兼容各种显卡,只要把这一款目标硬件跑稳。

目标硬件平台确定为:

  • CPU:x86-64,Intel 集成显卡
  • 固件:UEFI(不考虑传统 BIOS/CSM 兼容模式)
  • 存储:NVMe 固态硬盘(M.2 接口)
  • 外部存储:USB 2.0(对应主机控制器规范是 EHCI,不是 USB 3.0 的 xHCI)
  • 人机交互:USB 键鼠 + 自研图形界面
  • 运动控制:GD32F4 + FPGA 自研的 PCIe 脉冲卡,负责电机脉冲;它和独立高频放电模块、电机控制与钼丝断线检测模块构成下位机三模块
  • 可选模块:GPS(地域锁定)、USB 4G(远程管控)——分期/租赁销售模式下的机器控制手段,出厂按选配写死

最后这块是这个项目和"写一个通用裸机 OS"最大的区别——运动控制卡是自研硬件,寄存器协议自己定义,驱动这一层反而是整个系统里最贴近实际业务价值的部分,系列后面单独开一篇讲。有一句要提前注明:自研脉冲卡只是系统支持的第一种卡形态,系统不会只支持一种卡。市面运动控制卡的谱系比这宽——PCIe EtherCAT 主站卡(凌华 PCIe-8338 一卡 64 轴、雷赛 DMC5000 标称 256 轴这类)、放机柜外独立运行的外置控制器(Ethernet/EtherCAT/USB 上联,雷赛 EMC/PAC、固高、倍福 CX、欧姆龙 NJ 这一类)都在路线图上——它们不吐脉冲、吐总线报文,接进系统靠的还是那句话:系统层不动,应用层写一个新的卡适配层。这套形态谱系的来历与选型账(ISA 怎么退场、PCI 为什么只剩维护现货、EtherCAT 为什么成了高端主流),《硬件篇》着重展开。

四、系统分层与开发顺序

整套系统按硬件初始化的自然依赖顺序分层,也是这个系列文章会按顺序覆盖的路线:

  1. 固件层:UEFI FFI 绑定,拿到 GOP 帧缓冲句柄和存储设备句柄,读取内存映射表,调用 ExitBootServices() 完成固件到内核的权力交接
  2. CPU 自举:接管 GDT/IDT,重建分页表,搭好中断处理框架——固件退场之后,这些底层机制不能再依赖固件建好的那一套
  3. 定时器与中断:APIC 做周期性中断源,HPET 校准频率,TSC 做高精度计时,这是后面系统调度和运动控制硬实时性的地基
  4. 系统调度:任务模型和上下文切换,控制主循环、图形界面、后台任务怎么共享 CPU 时间
  5. 显示与图形界面:Intel 集成显卡走 GOP 帧缓冲,自研 2D 渲染层、字体、控件系统
  6. 总线与外设驱动:PCIe 枚举(服务于运动控制卡的发现)、USB 2.0/EHCI(服务于键鼠和 U 盘)、NVMe(固态硬盘)
  7. 文件系统:exFAT 读写
  8. 应用层:运动控制卡驱动细节、G代码/3B代码解析、插补算法、锥形切割等线切割专属算法、3D 切割过程模拟

前面 1-7 层是这个系统不管做什么控制逻辑都绕不开的基础设施,会先集中把这批做完。第 8 层的应用层内容会在基础打好之后陆续补充,插补算法、锥形切割这些线切割行业的专业算法值得单独成文细讲,不会挤在基础设施的篇幅里草草带过。

这个分层再往上看,就是系统整体的两层职责:系统层(1-7 层的 OS 基础设施)对所有设备一视同仁,不写死任何一块卡——PCIe 层提供的是通用设备框架(枚举、BAR 映射、MSI、DMA 环、驱动注册接口);应用层(第 8 层)是机床业务,桥梁就是 PCIe 运动控制卡:换一块卡、换一种机床,系统层不动,应用层写一个新的卡适配层就能开新业务。这也意味着 1-7 层的基础设施本质上跟"具体是哪种工业设备"无关,只跟"跑在 x86-64 + UEFI 的硬件上"有关——固件对接、CPU 自举、调度、图形界面、PCIe/USB/NVMe 驱动、文件系统,这些东西线切割机需要,CNC 加工中心、其他工业控制设备同样需要。真正跟线切割绑定的只有第 8 层:运动控制卡的具体寄存器协议、G代码/3B代码解析、插补算法这些应用逻辑。未来底层这套自研系统换到 CNC 等其他工业设备上,理论上只需要重新实现第 8 层,不用从头再来一遍——专用的是最终产品形态,不是底层这套系统本身。

总结

这个项目的核心判断是:工业控制系统的可靠性和长生命周期要求,值得为此多付出一些工程成本——用 Rust 换编译期的内存安全,用零外部依赖换十几年后不被第三方库的生死卡住,用专用系统的定位换掉通用兼容性带来的无谓工程量。这篇定了整体方向和分层顺序,接下来几篇会从 UEFI 固件层开始,按顺序把每一层的实现细节记下来。

系列目录

基础篇(本系列按依赖顺序推进,建议按序阅读):

  1. 立项与技术选型(本篇)
  2. UEFI固件层实战——手写FFI绑定与ExitBootServices权力交接
  3. CPU自举实战——重建GDT/IDT、TSS专用栈与中断框架
  4. 内存管理器实战——物理页帧分配器、内核堆与DMA内存池
  5. APIC定时器与系统时间实战——寄存器级配置、HPET校准与RTC读写
  6. 中断驱动的硬实时层与协作式主循环——两级调度模型设计
  7. Intel集成显卡实战——从GOP帧缓冲接管显示输出
  8. 显示子系统深入——EDID、模式协商、显存与品牌信息的获取
  9. 图形系统实战——2D渲染、中文点阵字体、控件与事件分发
  10. PCIe总线枚举实战——ECAM配置空间、BAR探测与MSI配置
  11. USB 2.0主机控制器实战——EHCI驱动、传输队列与设备枚举
  12. USB协议详解——设备类、四种传输与键鼠U盘的数据通路
  13. 键盘与鼠标驱动实战——USB HID Boot协议解析与输入事件管道
  14. NVMe固态硬盘驱动实战——队列、PRP与块设备抽象
  15. U盘驱动实战——USB大容量存储SCSI命令与块设备接入
  16. exFAT文件系统实战——引导扇区、目录项与掉电一致性
  17. 网络驱动与协议栈实战——e1000有线网卡、USB无线路径与自研TCP/IP
  18. 平台管理实战——电源控制、风扇调速与内存信息获取
  19. CPU信息与多核实战——CPUID、INIT-SIPI-SIPI唤醒与双核分工
  20. 日志系统实战——无锁环形缓冲、分级输出与断电安全落盘
  21. 参数系统与断电恢复实战——双副本参数表与加工现场快照
  22. 开机自检与固件更新实战——POST报告、A/B双槽与版本回滚
  23. 国际化实战——UTF-8内码、多语言字库与locale区域设置
  24. 合规与安全控制实战——GPS地域锁、授权码体系与4G远程管控
  25. 实时性验证实战——TSC延迟测量、抖动直方图与烤机准则

应用篇(基础篇收官后陆续补充):机床界面实战——从启动LOGO到锁定解锁的七块屏(已发)、G代码与3B解析实战——模态状态机、象限重建与段表生成(已发)、G代码与3B代码详解——两代线切割程序语言的来历、格式与方言(已发)、电火花线切割的来历——发明往事、快慢走丝分岔与切削CNC对比(已发)、电机驱动基础——步进与伺服、脉冲方向接口与加减速的来历(已发)、放电加工与高频电源——电蚀物理、规准与间隙伺服的来历(已发)、运动控制卡驱动(PCIe 运动控制卡=下位机三模块之一,等手册;系统层通用设备框架之上的卡适配层,寄存器表已由插补篇立为合同;脉冲卡只是第一种形态,EtherCAT 主站卡与外置控制器在路线图上,硬件篇展开)、插补基础——从一段几何到一串脉冲,机床是怎么走出一条斜线的(已发)、插补实战——逐点比较法、偏差递推与脉冲节拍(已发)、锥形切割实战——锥度几何、切点漂移与UV轨迹生成(已发)、3D切割过程模拟——直纹面重构、弧长配对与三维仿真屏(已发)、中文输入法、MES 对接(Modbus-TCP / MTConnect / OPC UA 分期走)、视觉定位接口(UVC 摄像头)等。

参考链接