自制工业控制系统:从UEFI到内核,为线切割机全自研专用系统的立项与技术选型
Contents
起因
前两篇整理了现代 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-rs、xhci、nvme 这类第三方 crate 写进 Cargo.toml,靠 crates.io 长期在线来保证能编译。十年后这些库的作者可能早就不维护了,Rust 编译器版本迭代几轮之后,不维护的库大概率过不了新工具链的编译,到时候想升级 Rust 版本、修一个安全漏洞,可能被一个自己不掌控的依赖卡住。
这个项目采用的策略是:参考开源实现,但代码全部搬进自己的仓库,不作为 Cargo 依赖挂在外面。具体分两层:
- UEFI 固件对接这一层:UEFI/PI 规范本身是稳定发布的行业标准,硬件厂商长期兼容,这个基准不会消失。所以这一层直接手写或参考
r-efi这类几乎不做封装的原始 FFI 绑定,本质上是把规范里的结构体定义翻译成 Rust 代码,复制进仓库,不依赖外部维护节奏。 ExitBootServices()之后的所有代码:PCIe 枚举、USB 驱动、NVMe 驱动、exFAT 文件系统、图形界面、控制逻辑,全部自己实现。会参考uefi-rs、xhci、obhq/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 为什么成了高端主流),《硬件篇》着重展开。
四、系统分层与开发顺序
整套系统按硬件初始化的自然依赖顺序分层,也是这个系列文章会按顺序覆盖的路线:
- 固件层:UEFI FFI 绑定,拿到 GOP 帧缓冲句柄和存储设备句柄,读取内存映射表,调用
ExitBootServices()完成固件到内核的权力交接 - CPU 自举:接管 GDT/IDT,重建分页表,搭好中断处理框架——固件退场之后,这些底层机制不能再依赖固件建好的那一套
- 定时器与中断:APIC 做周期性中断源,HPET 校准频率,TSC 做高精度计时,这是后面系统调度和运动控制硬实时性的地基
- 系统调度:任务模型和上下文切换,控制主循环、图形界面、后台任务怎么共享 CPU 时间
- 显示与图形界面:Intel 集成显卡走 GOP 帧缓冲,自研 2D 渲染层、字体、控件系统
- 总线与外设驱动:PCIe 枚举(服务于运动控制卡的发现)、USB 2.0/EHCI(服务于键鼠和 U 盘)、NVMe(固态硬盘)
- 文件系统:exFAT 读写
- 应用层:运动控制卡驱动细节、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 固件层开始,按顺序把每一层的实现细节记下来。
系列目录
基础篇(本系列按依赖顺序推进,建议按序阅读):
- 立项与技术选型(本篇)
- UEFI固件层实战——手写FFI绑定与ExitBootServices权力交接
- CPU自举实战——重建GDT/IDT、TSS专用栈与中断框架
- 内存管理器实战——物理页帧分配器、内核堆与DMA内存池
- APIC定时器与系统时间实战——寄存器级配置、HPET校准与RTC读写
- 中断驱动的硬实时层与协作式主循环——两级调度模型设计
- Intel集成显卡实战——从GOP帧缓冲接管显示输出
- 显示子系统深入——EDID、模式协商、显存与品牌信息的获取
- 图形系统实战——2D渲染、中文点阵字体、控件与事件分发
- PCIe总线枚举实战——ECAM配置空间、BAR探测与MSI配置
- USB 2.0主机控制器实战——EHCI驱动、传输队列与设备枚举
- USB协议详解——设备类、四种传输与键鼠U盘的数据通路
- 键盘与鼠标驱动实战——USB HID Boot协议解析与输入事件管道
- NVMe固态硬盘驱动实战——队列、PRP与块设备抽象
- U盘驱动实战——USB大容量存储SCSI命令与块设备接入
- exFAT文件系统实战——引导扇区、目录项与掉电一致性
- 网络驱动与协议栈实战——e1000有线网卡、USB无线路径与自研TCP/IP
- 平台管理实战——电源控制、风扇调速与内存信息获取
- CPU信息与多核实战——CPUID、INIT-SIPI-SIPI唤醒与双核分工
- 日志系统实战——无锁环形缓冲、分级输出与断电安全落盘
- 参数系统与断电恢复实战——双副本参数表与加工现场快照
- 开机自检与固件更新实战——POST报告、A/B双槽与版本回滚
- 国际化实战——UTF-8内码、多语言字库与locale区域设置
- 合规与安全控制实战——GPS地域锁、授权码体系与4G远程管控
- 实时性验证实战——TSC延迟测量、抖动直方图与烤机准则
应用篇(基础篇收官后陆续补充):机床界面实战——从启动LOGO到锁定解锁的七块屏(已发)、G代码与3B解析实战——模态状态机、象限重建与段表生成(已发)、G代码与3B代码详解——两代线切割程序语言的来历、格式与方言(已发)、电火花线切割的来历——发明往事、快慢走丝分岔与切削CNC对比(已发)、电机驱动基础——步进与伺服、脉冲方向接口与加减速的来历(已发)、放电加工与高频电源——电蚀物理、规准与间隙伺服的来历(已发)、运动控制卡驱动(PCIe 运动控制卡=下位机三模块之一,等手册;系统层通用设备框架之上的卡适配层,寄存器表已由插补篇立为合同;脉冲卡只是第一种形态,EtherCAT 主站卡与外置控制器在路线图上,硬件篇展开)、插补基础——从一段几何到一串脉冲,机床是怎么走出一条斜线的(已发)、插补实战——逐点比较法、偏差递推与脉冲节拍(已发)、锥形切割实战——锥度几何、切点漂移与UV轨迹生成(已发)、3D切割过程模拟——直纹面重构、弧长配对与三维仿真屏(已发)、中文输入法、MES 对接(Modbus-TCP / MTConnect / OPC UA 分期走)、视觉定位接口(UVC 摄像头)等。
参考链接
- UEFI Forum:UEFI Specifications 主页
- rust-osdev/uefi-rs——UEFI Rust 封装参考实现
- r-efi——UEFI 原始 FFI 绑定
- rust-osdev/xhci——USB xHCI 寄存器/上下文类型参考
- obhq/exfat——exFAT 纯 Rust 只读实现参考
- 本站前两篇:从加电到长模式:x86引导原理笔记、现代UEFI平台真实工作方式——本系列的底层原理基础
Author 软件开发大郭
LastMod 2026-09-10