FEATURE · FUSION KERNEL

融合内核

HopeOS 的内核,装进 XJ380OS 的零件。

HopeOS 保持内核、用户态、GUI 与 POSIX ABI 的主体地位,把 XJ380OS 已经打磨过的硬件/内核基础设施按子系统吸收进来:ACPI、PCI、AHCI、 FAT32、e1000、lwIP 与 SMP。四个阶段都已落地并在 QEMU 验收,本页把 “融合了什么、怎么验的、踩了哪些坑”一次讲清楚。

4 个阶段已落地4×vCPU SMPAHCI + FAT32lwIP TCP

HopeOSXJ380OS融合内核

两个标志都按原样保留,只在右上 / 左下错开一部分重叠:左边是 HopeOS(桌面 · 用户态 · POSIX),右边是 XJ380OS(ACPI · PCI · AHCI · FAT32 · lwIP · SMP)。 重叠的那块,就是融合内核。

WHY FUSION

为什么是「融合」,不是「换底座」

方向是单向的:HopeOS 当主体,XJ380 当零件供应商。反过来做要重写 GUI 和整条用户态,成本高一个数量级。

HOPEOS 提供

桌面、用户态与 ABI

  • 内核 GUI + 自研 X server + IceWM 窗口管理
  • StarDustUI 两套原生 shell(StarDust / HopeOS 95)
  • ring 3 + POSIX 子集 96 syscall,跑得动 nano、coreutils
  • VFS / ramfs / 抢占式调度 / COW 页表

XJ380OS 提供

硬件与内核基础设施

  • ACPI / APIC / HPET / SMP 拓扑与接管
  • PCI / PCIe 枚举、AHCI 块设备
  • FAT32、e1000 网卡、lwIP 协议栈
  • XSK2.1 内核里打磨过的寄存器与协议细节
判据以 HopeOS 为主体(采用)以 XJ380 为底座(否决)
GUI内核 GUI + X server + IceWM + StarDustUI 已经能跑XJ380 2026-08 已移除 GUI,等于从零重写
用户态 ABIPOSIX 子集 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 · IceWM

XJ380OS · 零件

ACPI / APIC / HPETPCI / PCIe 枚举AHCI · FAT32e1000 · lwIPSMP 接管 · SIPI
一个内核:HopeOS产品名、GUI、用户态、许可证主体都不变;硬件能力是净增的。

WHAT LANDED

已经融合了什么

八块能力,全部有验收记录;数字都来自 QEMU(q35 + OVMF)的真实串口日志。

P1固件 / 总线

ACPI 表解析

RSDT / XSDT 自动选择,MADT、MCFG、HPET 全部进 g_acpi;checksum 坏表直接跳过。

ACPI 48 项单测

P1固件 / 总线

PCI / PCIe 枚举

0xCF8/0xCFC 机制扫 255 条总线,多功能设备、64 位 BAR、class code 全解析。

PCI 43 项单测

P2存储

AHCI 块设备

COMRESET → 引擎启动 → IDENTIFY / 扇区读,轮询实现,不需要中断。

131072 扇区

P2存储

FAT32 只读挂载

BPB / FAT 链 / 8.3 目录项解析,实现 fs_ops 的 lookup/readdir/read;写操作 EROFS。

/disk 可 ls、cat

P3网络

e1000 网卡驱动

8254x 轮询驱动:PCI BAR0、控制器复位、RX/TX 描述符环、MAC 从 RAL/EEPROM 读。

ARP 自检通过

P3网络

lwIP 2.2.0 协议栈

IPv4 / ARP / ICMP / TCP,NO_SYS 模式,sys_now() 用 PIT2 + rdtsc 标定毫秒时钟。

ping 网关通过

P3网络

TCP 客户端 + AF_INET

kernel raw-TCP 自检 + fs_sock_hooks 桥接;busybox wget 与 ifconfig 是真实用户态程序。

wget 保存成功

P4SMP

4 vCPU 接管

EBS 在固件描述符下完成,SIPI trampoline 拉起 3 个 AP,/proc/cpuinfo 报 4 核。

3 / 3 AP online

TIMELINE

四个阶段,逐段可回滚

每个阶段独立可回滚、可演示;下面的日志片段是验收时真实打印的内容。

  1. P12026.10.30已完成

    基础设施:ACPI + PCI 枚举

    解析 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,碰它是三重故障。

  2. P22026.10.30已完成

    存储:AHCI + FAT32

    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 状态打坏。

  3. P32026.10.30已完成

    网络:e1000 + lwIP + TCP + AF_INET

    自写 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 仍能在宿主编译、原有单测不受影响。

  4. P4a2026.10.30已完成

    SMP 第一步:CPU 拓扑 + BSP APIC

    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 下执行。

  5. P4b2026.10.31已完成

    SMP 第二步:4 vCPU 完整启动 + AP 上线

    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 兜底门,否则杂中断 = 三重故障。

  6. P4c下一步进行中

    SMP 第三步:多核调度

    AP 先改成 hlt 空闲循环 + IPI 唤醒;中断从 8259 迁到 IOAPIC(24 条重定向表已读出来);调度器加核间锁与每核 runqueue,单核 irq_save() 的互斥假设要全部复核。

    验收目标:sysmonitor 里看到多核各自跑任务

ENGINEERING NOTES

真正花时间的地方

融合不是“抄过来就能跑”:团队在 QEMU trace 下逐个定位了这些坑,全部写进 ROADMAP 与代码注释,避免以后再踩。

AHCI

AHCI 命令头的 tbl_addr 在 byte 8

byte 4 是 PRDBC。写错会让控制器从物理地址 0 DMA 128 字节,报 “unhandled FIS type 0x00”。

AHCI

PRDT 字节计数在最后一个 dword

offset 12 才是字节数,offset 8 是 reserved。写反会只 DMA 1 字节——现象是“读成功但全是 0”。

AHCI

COMRESET 后先启动引擎再等 ready

设备要等 FIS 接收使能后才发第一个 D2H FIS;先等 ready 就是死锁。

e1000

e1000 必须先置 PCI COMMAND.BUS_MASTER

QEMU 对 bus-master 位为 0 的设备直接吞掉 DMA:寄存器可读、link=up、报文永远不动。

e1000

ExitBootServices 会把 e1000 复位

OVMF 的 EBS 清掉 TCTL/RCTL/TDBAL。内核自检在 EBS 之前跑所以没暴露,用户态 wget 才发现 —— 修复是在 sched_init() 之后重做 e1000_reinit()。

SMP

EBS 必须跑在固件的 GDT/IDT 下

多 CPU 时 OVMF 的 EBS 会走 MP 协议停靠 AP 的路径,用我们的描述符就三重故障。take_control 现在只切栈,EBS 之后才换表。

SMP

SIPI 入口必须 patch 成绝对物理地址

SIPI 永远从 page:0000 进入,进入长模式后 CS base 变 0;另外 AP 也要打开 EFER.NXE,否则 PTE 的 NX 位被当 reserved 位。

lwIP

lwIP raw API 的 pbuf 是 IP 头在内

raw_input() 在 pbuf_remove_header 之前调用;按“payload 就是 ICMP 头”解析会把 0x45 当成 ICMP type=69。

SCREENSHOTS

融合后的真实终端

四 vCPU + e1000 的 QEMU 机器上:ifconfig / wget 走真实的 AF_INET socket; /proc/cpuinfo 报 4 核。

HopeOS 终端里运行 busybox ifconfig 和 wget,wget 从宿主机 HTTP 服务器下载页面成功
用户态网络 busybox ifconfig 读 SIOCGIF*,wget 走 AF_INET socket;内核里是 e1000 → lwIP 2.2.0 → fs_sock_hooks。
HopeOS 的 /proc/cpuinfo 显示 4 个 CPU,串口日志显示 3 of 3 AP online
四核接管 ExitBootServices 在固件描述符下完成,SIPI trampoline 把 3 个 AP 拉起来;/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 等),再分发 需提供对应源码获取方式;完整清单见 第三方组件许可证。

WHAT'S NEXT

下一步:让四个核真正一起干活

P4b-2 之后 AP 还在 pause 忙等。接下来把它们改成 hlt 空闲循环 + IPI 唤醒,中断迁到 IOAPIC,调度器加每核 runqueue 与核间锁——这是融合里 风险最高的一步,也是“多核操作系统”真正成立的一步。