HOPEOS 提供
桌面、用户态与 ABI
- 内核 GUI + 自研 X server + IceWM 窗口管理
- StarDustUI 两套原生 shell(StarDust / HopeOS 95)
- ring 3 + POSIX 子集 96 syscall,跑得动 nano、coreutils
- VFS / ramfs / 抢占式调度 / COW 页表
FEATURE · FUSION KERNEL
HopeOS 的内核,装进 XJ380OS 的零件。
HopeOS 保持内核、用户态、GUI 与 POSIX ABI 的主体地位,把 XJ380OS 已经打磨过的硬件/内核基础设施按子系统吸收进来:ACPI、PCI、AHCI、 FAT32、e1000、lwIP 与 SMP。四个阶段都已落地并在 QEMU 验收,本页把 “融合了什么、怎么验的、踩了哪些坑”一次讲清楚。

HopeOSXJ380OS融合内核
两个标志都按原样保留,只在右上 / 左下错开一部分重叠:左边是 HopeOS(桌面 · 用户态 · POSIX),右边是 XJ380OS(ACPI · PCI · AHCI · FAT32 · lwIP · SMP)。 重叠的那块,就是融合内核。
WHY FUSION
方向是单向的:HopeOS 当主体,XJ380 当零件供应商。反过来做要重写 GUI 和整条用户态,成本高一个数量级。
HOPEOS 提供
XJ380OS 提供
| 判据 | 以 HopeOS 为主体(采用) | 以 XJ380 为底座(否决) |
|---|---|---|
| GUI | 内核 GUI + X server + IceWM + StarDustUI 已经能跑 | XJ380 2026-08 已移除 GUI,等于从零重写 |
| 用户态 ABI | POSIX 子集 96 个 syscall,nano / busybox / StarDustUI 在跑 | XAPI 私有 ABI + Linux 兼容层,整条用户态要重做 |
| 复用率 | 搬进来的每个子系统都是净增能力 | HopeOS 的 5.5k 行内核 GUI 与调好的用户态全部要重接 |
| 许可证 / 品牌 | 只要署名,产品名仍然是 HopeOS | 叫“XJ380 发行版”要拿商标许可 |
FUSION MAP
解法是“按文件搬、不整仓 vendoring”:每个搬进来的单元都要在 HopeOS 工具链下重编、跑宿主/客机测试,并登记来源。
HopeOS · 主体
内核 GUI / X serverPOSIX syscall / ring 3VFS · ramfs · 调度器StarDustUI · IceWMXJ380OS · 零件
ACPI / APIC / HPETPCI / PCIe 枚举AHCI · FAT32e1000 · lwIPSMP 接管 · SIPIWHAT LANDED
八块能力,全部有验收记录;数字都来自 QEMU(q35 + OVMF)的真实串口日志。
RSDT / XSDT 自动选择,MADT、MCFG、HPET 全部进 g_acpi;checksum 坏表直接跳过。
ACPI 48 项单测
0xCF8/0xCFC 机制扫 255 条总线,多功能设备、64 位 BAR、class code 全解析。
PCI 43 项单测
COMRESET → 引擎启动 → IDENTIFY / 扇区读,轮询实现,不需要中断。
131072 扇区
BPB / FAT 链 / 8.3 目录项解析,实现 fs_ops 的 lookup/readdir/read;写操作 EROFS。
/disk 可 ls、cat
8254x 轮询驱动:PCI BAR0、控制器复位、RX/TX 描述符环、MAC 从 RAL/EEPROM 读。
ARP 自检通过
IPv4 / ARP / ICMP / TCP,NO_SYS 模式,sys_now() 用 PIT2 + rdtsc 标定毫秒时钟。
ping 网关通过
kernel raw-TCP 自检 + fs_sock_hooks 桥接;busybox wget 与 ifconfig 是真实用户态程序。
wget 保存成功
EBS 在固件描述符下完成,SIPI trampoline 拉起 3 个 AP,/proc/cpuinfo 报 4 核。
3 / 3 AP online
TIMELINE
每个阶段独立可回滚、可演示;下面的日志片段是验收时真实打印的内容。
解析 RSDP → RSDT/XSDT → MADT / MCFG / HPET,校验表和表头 checksum;PCI 走配置机制 #1(0xCF8/0xCFC)扫 0..255 总线,支持多功能设备,把 vendor/device/class/BAR 存进 g_pci,供后面三个阶段使用。
acpi: madt=... cpus=1 ioapics=1 pci 00:1F.2 8086:2922 sata cls=01:06:01 p1: pci=ok ahci=yes(00:1F.2) e1000=yes(00:02.0)
ACPI 48 项 + PCI 43 项宿主单测;没有走 ECAM —— 此刻内核还没有映射 0xE0000000,碰它是三重故障。
AHCI 从 PCI 找到控制器,COMRESET、启动引擎、IDENTIFY + 扇区读全用轮询,暴露成 struct blkdev;FAT32 只读后端(BPB、FAT 链、8.3 目录项)实现 fs_ops,写操作统一 EROFS。VFS 为此补了挂载表,磁盘挂到 /disk。
ahci: read LBA0 rc=0 sig=0xAA55 ... sectors=131072 fat32: mounted at /disk root_cluster=2 cluster_size=512 hopeos:/$ cat /disk/HELLO.TXT
挂载必须放在 espload 之后、boot menu 之前:AHCI 初始化会 COMRESET 端口,把固件的 SATA 状态打坏。
自写 e1000 8254x 轮询驱动(PCI BAR0、RX/TX 环、MAC 从 RAL/EEPROM 读);移植上游 lwIP 2.2.0(NO_SYS,移植层在 kernel/net/);再往上补 raw-TCP 客户端与 AF_INET socket 桥,busybox wget / ifconfig 直接可用。
net: lwIP up on e0, ip=10.0.2.15 p3b: ping reply from gateway p3c: tcp connected, response=HTTP/1.0 200 OK
fs 层只做转发(struct fs_sock_hooks),所以 fs.c 仍能在宿主编译、原有单测不受影响。
MADT 扩展成完整拓扑:所有 enabled CPU 的 APIC ID、第一个 IOAPIC 的基址/ID/GSI 基;smp.c 从 IA32_APIC_BASE(MSR 0x1B)读 APIC 基址与 BSP 位。纯读,不改引导行为。
smp: cpus=1 bsp=1 first_apic_id=0 apic_base=... · -smp 4 时 MADT 正确解出 cpus=4 apic_ids=0,1,2,3
发现 -smp 4 过不了 boot menu:不是 AP 的问题,而是 ExitBootServices 必须在固件自己的 GDT/IDT 下执行。
take_control 不再提前换 GDT/IDT/TSS;EBS 完成后才 enter_own_descriptors()。新增位置无关的 SIPI trampoline:实模式 → 保护模式 → PAE/LME/NXE → 长模式 → AP 入口。3 个 AP 全部 online 并自增 ticks。
smp: AP1 online (slot 1) smp: 3 of 3 AP(s) online, ticks=1321959,755687,143676 · ifconfig / fastfetch(CPU 4 核 @2.59 GHz)/ wget 全部正常
顺带修掉 OVMF 留下的 LAPIC spurious vector 0x0F 与空兜底门:补 0x30–0xFF 兜底门,否则杂中断 = 三重故障。
AP 先改成 hlt 空闲循环 + IPI 唤醒;中断从 8259 迁到 IOAPIC(24 条重定向表已读出来);调度器加核间锁与每核 runqueue,单核 irq_save() 的互斥假设要全部复核。
验收目标:sysmonitor 里看到多核各自跑任务
ENGINEERING NOTES
融合不是“抄过来就能跑”:团队在 QEMU trace 下逐个定位了这些坑,全部写进 ROADMAP 与代码注释,避免以后再踩。
byte 4 是 PRDBC。写错会让控制器从物理地址 0 DMA 128 字节,报 “unhandled FIS type 0x00”。
offset 12 才是字节数,offset 8 是 reserved。写反会只 DMA 1 字节——现象是“读成功但全是 0”。
设备要等 FIS 接收使能后才发第一个 D2H FIS;先等 ready 就是死锁。
QEMU 对 bus-master 位为 0 的设备直接吞掉 DMA:寄存器可读、link=up、报文永远不动。
OVMF 的 EBS 清掉 TCTL/RCTL/TDBAL。内核自检在 EBS 之前跑所以没暴露,用户态 wget 才发现 —— 修复是在 sched_init() 之后重做 e1000_reinit()。
多 CPU 时 OVMF 的 EBS 会走 MP 协议停靠 AP 的路径,用我们的描述符就三重故障。take_control 现在只切栈,EBS 之后才换表。
SIPI 永远从 page:0000 进入,进入长模式后 CS base 变 0;另外 AP 也要打开 EFER.NXE,否则 PTE 的 NX 位被当 reserved 位。
raw_input() 在 pbuf_remove_header 之前调用;按“payload 就是 ICMP 头”解析会把 0x45 当成 ICMP type=69。
SCREENSHOTS
四 vCPU + e1000 的 QEMU 机器上:ifconfig / wget 走真实的 AF_INET socket; /proc/cpuinfo 报 4 核。


LICENSE & PROVENANCE
融合代码的许可证边界是清楚的:XJ380OS 以 Apache-2.0 提供,HopeOS 项目本体也是 Apache-2.0。
搬进来的每个单元都记录原路径、上游 commit、sha256 与改动点,写在 docs/fusion/PROVENANCE.md;修改过的文件在文件头注明 “Derived from OpenXJ380 …” 与修改说明(Apache-2.0 §4(b))。
lwIP 为 BSD-3-Clause,移植层是 HopeOS 自写;XJ380OS 的名称与品牌归 星际工作室(XINGJI Studio)所有,此页仅作归属说明与技术引用,不暗示 官方背书。
HopeOS 镜像内含 GPL 组件(BusyBox、GNU coreutils、nano 等),再分发 需提供对应源码获取方式;完整清单见 第三方组件许可证。