This commit is contained in:
xyou
2026-07-31 13:53:49 +08:00
parent 5ea84fac97
commit f52157b7af
241 changed files with 26843 additions and 8155 deletions
@@ -0,0 +1,265 @@
# Deshab Linux/EXE 兼容层开发
## 架构总览
```
桌面命令行1: shell.elf (原生系统命令行 + linux 命令委托执行)
桌面命令行2: cmd.elf (Windows 风格命令行 + PE/EXE 兼容)
```
三个垂直层次:
1. **虚拟化底座**:UTSM 作为 Type-1 hypervisor,VMX/EPT 完整虚拟化,park-and-resume 机制让 Linux guest 与 DSK 时分复用 CPU
2. **双兼容引擎**:Linux 兼容路径(IPC 委托 Linux guest 执行)+ PE/EXE 兼容路径(UTSM 内置 PE loader + x86emu32 解释器)
3. **用户界面与文件系统**:shell.elf / cmd.elf / desktop.elf / FAT32 / initramfs+virtio-blk
## 一、PE/EXE 兼容层(UTSM 内置,`CODE/UTSM/pe/`)
### 1. pe_service.c / pe.h — 统一服务入口
- 全局 service table(函数指针表):`pe_load()` / `pe_run()` / `pe_unload()`
- PE32+ → preferred_base 加载,Ring0 原生执行(MS x64 ABI)
- PE32 → 专用大缓冲区,x86emu32 解释执行
- 通过 `dsk_boot_context.reserved[4]` 暴露给 DSK
### 2. pe_loader.c — PE 解析/映射/重定位
- DOS Header → PE Header → Section Table 解析
- PE32+:`__attribute__((ms_abi))` shim,原生 Ring0 执行
- PE32:无需重定位,直接 preferred_base 加载
- `apply_relocations(image_size)` — base relocation 处理
- `pe_get_iat_entries()` — 暴露 IAT 给 shim 注册
- import 解析 → 查 shim 表 → 填充 IAT
### 3. pe_shim.c / pe_shim.h — Windows API 拦截
- IAT 拦截:按 DLL!Function 名查 shim 表填充函数指针
- shim 函数签名用 `__attribute__((ms_abi))`
- `__builtin_setjmp`/`__builtin_longjmp`(`void **`)用于 PE 入口异常恢复
- 每条 IAT 条目可注册 `fn32`(PE32)和 `fn64`(PE32+),`try_iat_call` 在 fn32=NULL 时回退到 fn64
### 4. x86emu32.c / x86emu32.h — x86-32 指令解释器
- 支持指令:MOV/ADD/SUB/AND/OR/XOR/CMP/TEST, SHL/SHR/SAR(含 CL 变长), PUSH/POP, JMP/Jcc/CALL/RET, MOVSX/MOVZX, rep_prefix, ModR/M+SIB 解码
- `emu->mem` 指向大缓冲区起始(虚拟地址 0),`mem[preferred_base + rva]` 正确寻址
- `try_iat_call` — 调用 IAT 中的 shim 函数
### cmd.elf(`CODE/cmd/main.c`)
- Windows cmd.exe 风格命令行,从 `reserved[4]` 读取 `pe_svc`
- 内置命令:dir, cd, type, copy, del, exit 等
- FAT32 I/O 通过 `f32_list_root()` 回调 API
- Esc 键返回 DSK,支持从 FAT32 root 加载 PE 文件执行
## 二、Linux 兼容层(双内核 park-and-resume)
### GPA 布局
| GPA 区间 | 用途 |
|---------|------|
| `0x00400000 - 0x02FFFFFF` | initrd / boot_params |
| `0x03000000 - 0x03FFFFFF` | Linux guest initrd |
| `0x04000000` | IPC 共享内存(1MB) |
| `0x05000000+` | Linux guest RAM(64MB) |
| `0x01000000` | Kernel 映射 |
| `0x00600000` | GDT |
### VMCS / VMEXIT 处理
- **vmexit_asm.S**:保存 16 个 guest GPR 到 `g_guest_regs`,调用 C `vmexit_dispatch()`
- dispatch 返回 0 → `vmresume`;返回非 0 → 恢复 host RSP/返回 RIP
- `g_saved_host_rsp` / `g_saved_return_rip` 全局变量(vmm.h 声明,vmm.c 定义)
**已实现 exit reason**:
| Exit Reason | 处理 |
|-------------|------|
| EXIT_HLT | park-and-resume:self-test 终止,Linux guest park |
| EXIT_EPT_VIOLATION | 按需分配 HPA,区分 RAM/MMIO |
| EXIT_CPUID | host passthrough + 屏蔽 VMX 位 |
| EXIT_IO_INSTRUCTION | COM1/PIC/PIT 模拟 |
| EXIT_RDMSR/WRMSR | MSR 读写处理 |
| EXIT_VMCALL | 9+ hypercall 分发 |
| EXIT_INTERRUPT_WINDOW | guest 开中断时注入 pending IRQ |
| EXIT_VMX_PREEMPTION_TIMER | 1ms 周期 exit |
### park-and-resume 机制
- `handle_hlt` 区分 self-test(终止)和 Linux guest(park)
- Linux guest HLT → 推进 guest RIP → `g_guest_parked = 1` → 返回非 0 → asm 恢复 host 上下文
- `linux_is_parked()` 查询状态,`linux_compat_exec()` 调用 `linux_resume()` 唤醒
- `linux_launch()` 成功后设 `g_guest_parked = 1`
### IPC 协议
**Hypercall ABI**:guest RAX = 操作码,RDI/RSI/RDX = 参数,返回值写入 guest RAX
- VMCALL 魔数 `0x5554534D48430000`("UTSMHC\0\0")
- 9 种基础 op:PING/HELLO/SHM_INFO/CAP_VALIDATE/UTRW_READ/UTRW_WRITE/DRR_CHECKPOINT/CONSOLE_WRITE/CONSOLE_READ
**IPC EXEC 协议**(消息号 16-20):
| 消息号 | 常量 | 用途 |
|-------|------|------|
| 16 | UTSM_MSG_EXEC_REQUEST | shell 请求 Linux 执行命令 |
| 17 | UTSM_MSG_EXEC_STDOUT | daemon 回传 stdout |
| 18 | UTSM_MSG_EXEC_STDERR | daemon 回传 stderr |
| 19 | UTSM_MSG_EXEC_EXIT | daemon 回传退出码 |
| 20 | UTSM_MSG_EXEC_READY | daemon 就绪通知 |
`ipc_exec_request` 结构体约束 ≤240 字节(适配 IPC 单消息槽)。
### linux_compat 服务(`CODE/UTSM/vmm/linux_compat.c`)
- `exec()` 实现:构建 `ipc_exec_request` → `ipc_shm_send()` → `linux_resume()` → 读取响应
- 通过 `dsk_boot_context.reserved[5]` 暴露
### shell `linux` 命令(`CODE/shell/main.c`)
- `cmd_linux` 函数:`linux ls -la` → `g_lxc_svc->exec("/bin/ls -la")`
- 支持绝对路径,Linux 未构建时显示"兼容层不可用"
### virtio 模拟
- 模型:virtio-mmio(非 PCI)
- **IRQ 路由**:virtio-blk → IRQ5(0x35),virtio-net → IRQ6(0x36),公式 `IRQ_vector = 0x30 + irq`
- MMIO 处理:EPT misconfig exit → 解码 guest 指令访问大小/数据 → 寄存器分发
- `QUEUE_NOTIFY` 后调用 `vmx_guest_queue_irq(0x30+irq)` 注入中断
- `maybe_inject_irq` 按 guest IMR/IF 决定投递时机
**virtio-blk**:桥接到 UTSM block API(ahci0 SATA 盘),8GB 容量
**virtio-net**:桥接到 UTSM net API,TX/RX ring 实现占位
**virtio-rootfs-blk**:memory-backed 后端,从 Limine boot module 加载 Arch rootfs 镜像
### EPT 动态页映射
- 4 级 EPT 页表 walk,支持 4KB/2MB/1GB
- `ept_identity_map(gpa, RWX)` — 1:1 恒等映射
- `ept_gpa_to_hpa(gpa)` — hypercall 访问 guest 内存
- EPT violation handler:RAM 区按需分配 HPA,MMIO 区路由到设备模拟
### Linux guest 启动流程(`kernel/main.c`)
1. `vmm_init()` — 启用 VMX、初始化 EPT、分配 VMCS
2. `vmm_self_test()` — 自测 guest vmlaunch
3. `ipc_shm_init()` — 分配 1MB 共享内存、EPT 映射到 GPA 0x04000000
4. `linux_loader_init()` — 加载 bzImage、setup boot_params、e820 映射
5. `linux_launch()` — 配置 VMCS、`virtio_mmio_init()`、arm preemption timer、`vmlaunch`
6. `linux_compat_init()` — 初始化 Linux 兼容服务
7. `dsk_load_and_jump()` — 加载 DSK 主内核
**cmdline 关键参数**:`nohlt` + `idle=poll`(禁止 guest HLT idle),仅 daemon 显式 park 时触发 UTSM resume
### Linux exec daemon(`CODE/linux/initramfs/bin/utsm_exec_daemon.c`)
- 静态编译,打包进 initramfs
- 流程:fork → exec 命令 → pipe 捕获 stdout/stderr → IPC 发送 EXEC_STDOUT/STDERR/EXIT → HLT park
- 缺失时 init 回退到 `setsid cttyhack sh`(ttyS0 交互 shell)
### UTSM driver(`CODE/linux/patches/utsm_hcall.c`)
- `/dev/utsm` 字符设备,VMCALL hypercall 封装
- SHM 映射(mmap 共享内存 GPA 0x04000000)
- ioctl 接口:RECV_MSG / SEND_MSG / PARK / GET_READY
## 三、WSL 构建 Linux 内核
### 构建步骤
```bash
# WSL 内执行
cd ~
curl -L -o linux-6.6.tar.xz https://mirrors.tuna.tsinghua.edu.cn/kernel/v6.x/linux-6.6.tar.xz
tar xf linux-6.6.tar.xz && cd linux-6.6
# 安装 UTSM 驱动
mkdir -p drivers/utsm/include
cp /mnt/d/Code/Deshab/CODE/linux/patches/utsm_hcall.c drivers/utsm/
cp /mnt/d/Code/Deshab/CODE/linux/patches/utsm_Kconfig drivers/utsm/Kconfig
cp /mnt/d/Code/Deshab/CODE/linux/patches/utsm_Makefile drivers/utsm/Makefile
cp /mnt/d/Code/Deshab/CODE/utsm-ipc/ipc_proto.h drivers/utsm/include/
bash /mnt/d/Code/Deshab/CODE/linux/fix_driver.sh ~/linux-6.6
# 配置 + 编译
cp /mnt/d/Code/Deshab/CODE/linux/configs/utsm_x86_64_defconfig .config
make olddefconfig
make -j$(nproc) KCFLAGS='-std=gnu17' bzImage # KCFLAGS 修复 gcc 15 C23 兼容
# 拷贝产物
mkdir -p /mnt/d/Code/Deshab/SYSTEM/boot
cp arch/x86/boot/bzImage /mnt/d/Code/Deshab/SYSTEM/boot/linux-bzImage
```
### 关键修复
1. **ipc_proto.h 条件编译**:`<stdint.h>` 在 Linux 内核不可用,需 `#ifdef __UTSM_KERNEL__` / `#include <linux/types.h>` 分支
2. **gcc 15 C23 兼容**:`bool`/`false` 变关键字,需 `KCFLAGS='-std=gnu17'`;顶层 Makefile `-std=gnu11` 改为 `-std=gnu17`;`arch/x86/boot/compressed/` 也需同步修改
3. **WSL ext4 I/O 错误**:WSL 虚拟磁盘可能损坏,需 `wsl --shutdown` + `wsl --unregister Ubuntu` + 重装
4. **WSL 网络问题**:GitHub 访问被墙,需用清华镜像下载内核 tarball
### initramfs 构建(`build.sh` / `build_initrd.sh`)
- busybox 1.35.0 静态二进制下载(缓存 `.cache/`)
- 内核自带 `gen_init_cpio` 打包(无 root、无 cpio 依赖)
- spec 声明 `/dev/console`、`/dev/ttyS0` 节点 + 14 个 applet symlink(含 switch_root、mkdir)
- daemon 静态编译
- init 脚本:daemon 缺失时回退 `setsid cttyhack sh`(ttyS0 交互 shell,bring-up 用)
## 四、WHPX 嵌套虚拟化问题
**问题**:WHPX 下 CPUID 报告 VMX 支持但 VMXON 不可用,导致 QEMU exit code 4 不可恢复崩溃。
**解决方案**(`vmx.c` `vmx_truly_available()`):
1. 检查 CPUID.01H:ECX[31] hypervisor present bit
2. 检测 Hyper-V 签名 → 通过 CPUID 检查嵌套 VMX 支持 → 无则跳过
3. 检测 KVM 签名 → 允许(KVM 通常支持嵌套 VMX)
4. 未知 Hypervisor → 保守跳过
5. `run_qemu.bat`:WHPX 下使用 `-cpu qemu64,-vmx` 禁用 VMX CPUID 标志
**QEMU 验证结果**:UTSM → VMM init → 检测 Hyper-V 无嵌套 VMX → 安全跳过 → 加载 DSK → shell.elf 正常运行
## 五、Arch rootfs 构建(第二阶段)
### build_arch_rootfs.sh 关键步骤
1. 下载 Arch bootstrap tarball(`.tar.zst` 格式,需 `zstd` 包)
2. 解压到 WSL 原生 ext4(`/tmp`,避免 9P 慢速 I/O)
3. 编译 utsm_exec_daemon 静态二进制并安装到 rootfs
4. stripping:删除 locale(109M)/man(37M)/include(39M)/doc(13M)/info(7.3M)/.a libs → 597M→363M
5. 创建 512MB ext4 镜像,rsync rootfs 内容
6. 拷贝最终 `rootfs.img` 到 `SYSTEM/boot/`
### 内核配置确认
- `CONFIG_EXT4_FS=y`, `CONFIG_VIRTIO_BLK=y`, `CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y`, `CONFIG_DEVTMPFS_MOUNT=y`, `CONFIG_VIRTIO_NET=y`
### init 脚本修改
- 挂载 `/dev/vdb`(Arch rootfs)→ `switch_root` 到 Arch
- 保留 phase-1 回退:无 rootfs 时 ttyS0 交互 shell
### limine.conf 修改
- 添加 `linux-rootfs.img` boot module
- cmdline 添加第三个 `virtio_mmio.device` 条目
## 六、Pacman 包管理方案(WSL 互操作模式)
### 核心矛盾
- pacman 依赖 glibc + POSIX syscall + libalpm + libcurl + gpgme + zlib/zstd/xz + 可写 Unix 文件层级 + fork/exec
- Deshab 是 SAS-R0 单地址空间 Ring0,无 POSIX 层、无动态链接器、无 syscall 入口
### 方案 C(推荐):IPC 委托执行
- `SYSTEM/bin/` 放 stub,PATH 命中后通过 IPC 委托 Linux guest 执行 `/usr/bin/xxx`
- Linux 程序在 Linux guest 内原生执行,依赖 glibc + Linux syscall ABI
### 五阶段实现
| 阶段 | 核心任务 | 状态 |
|------|---------|------|
| 第一阶段 | Linux guest 跑到 shell | 代码就绪,需真机 VT-x 验证 |
| 第二阶段 | Arch rootfs + pacman + 网络 | rootfs 已构建,需 VMX 环境验证 |
| 第三阶段 | FILE_TRANSFER hypercall + payload_pool 分块传输 | 未实现 |
| 第四阶段 | EXEC_FORWARD hypercall + shell 委托执行 | 未实现 |
| 第五阶段 | desktop 动态注册 Linux 命令图标 | 未实现 |
## 七、已实现 vs 待实现
### 已实现
- PE 兼容层完整(pe_service/loader/shim/x86emu32),零警告
- cmd.elf + shell.elf `linux` 命令 + desktop 双命令行
- park-and-resume + IPC exec 协议(消息 16-20)+ linux_compat 服务
- Linux driver ioctl(RECV_MSG/SEND_MSG/PARK/GET_READY)+ exec daemon
- virtio-mmio 框架 + virtio-blk/net/rootfs-blk 后端 + EPT 动态页映射
- vmexit dispatch 接线(CPUID/IO/INT_WINDOW/PREEMPTION_TIMER)+ virtio IRQ 注入
- WHPX 安全 VMX 检测 + 优雅回退
- build.sh busybox initramfs 打包 + Arch rootfs 构建脚本
- Linux bzImage(5.7MB) + initrd(1MB) + rootfs.img(512MB stripped) 已构建
- FAT32 镜像含 CMD ELF
### 待实现
- 真机 VT-x / KVM 环境验证 Linux guest 启动
- FILE_TRANSFER / EXEC_FORWARD hypercall
- 完整 Win32 API + .NET API 覆盖
- virtio-net 完整 TX/RX ring
- Arch rootfs 在 VMX 环境中实际运行验证
- pacman 镜像源配置 + AUR helper
- desktop 动态注册 Linux 命令图标
- FAT32 ESP 容量扩展(当前 128MB 不够容纳 rootfs.img)
@@ -0,0 +1,20 @@
# 开发操作系统以运行Deaicup软件
## 软件需求分析
**Deaicup Software** 是一个 Rust/egui GUI 应用:
- 侧边栏导航 + 页面切换
- 依赖:Rust std 运行时、egui 渲染后端(OpenGL/Vulkan)、窗口系统、网络(HTTPS 加载图片)、文件系统
## 操作系统现状
- **原生环境**:Ring0 单地址空间,自有 framebuffer UI 框架(deshab_ui.h),无 Rust 运行时、无 GPU 驱动、无窗口服务器
- **Linux 兼容层**:有 Arch rootfs + IPC exec/file,但**无显示服务器、无 GPU、无输入转发**
## 运行路径
运行 Rust/egui 应用有两条路径:
1. **Linux guest 路径**:在 Linux guest 内运行,需要 X11/Wayland 显示服务器 + GPU/Virtio-GPU + 输入转发
2. **原生路径**:将 egui 渲染后端适配到 Deshab framebuffer,需要 Rust std 移植 + 自定义 eframe 后端
两条路径都需要大量基础设施工作,无近路。
@@ -0,0 +1,154 @@
# 整理 RE/上下文 文档
## 文档地图(共 18 份 + 8 份测试用例)
| 层级 | 文档 | 内容 |
|------|------|------|
| 内核设计层 (`docs/RE/`) | UTSM_设计架构.md | UTSM 架构定稿:模块组成、内存模型、数据结构、UTRW、DRR 协作 |
| | UTSM_算法记录.md | UTSM v1 核心算法:段创建、密钥派生、Fast/Slow Read/Write、PCKC、Checkpoint、Rollback |
| | 驱动模块ABI设计.md | DKM ABI:driver_desc/driver_init/driver_exit、kernel_api、ELF relocation、manifest、状态机、boot module |
| | Bug记录.txt | 8 条未结构化 bug 记录 |
| 系统架构层 (`docs/`) | ARCHITECTURE.md | 系统整体架构:SAS-R0-PCQ/UTSM/UTRW/DRR/DKM 五大核心支柱 |
| | BOOT_SEQUENCE.md | 五阶段启动:Ignis/Sigillum/Transitus/Origo/Excitas |
| | ROADMAP.md | Phase 0-9 分阶段开发路线图 |
| 开发记录层 (`docs/上下文/`) | 6 份对话记录 | 双内核/Linux EXE/桌面 UI/Pacman 等实现细节 |
| 测试用例 (`docs/RE/test-cases/`) | 8 份 | boot-regression/driver-matrix/linux-compat/network-e2e/pe-compat/performance-baseline/userapps-matrix/x86emu32-coverage |
## 关键同步差距(文档 vs 实现态)
- ROADMAP 滞后:网络协议栈已实现却标"无协议栈";未收录桌面/Linux/PE 兼容层/Pacman
- ARCHITECTURE 仍描述"旋转加载环",实际已被静态 Logo 取代
- BOOT_SEQUENCE 标 B4 正常路径"仅 halt",实际 login → desktop 已实现
---
## 兼容层子系统技术摘要
### 双内核架构(UTSM + Linux)
**核心设计**:VMX/EPT 完整虚拟化,UTSM 作为 Type-1 hypervisor(monitor 模型),Linux 6.6 LTS guest 运行在 VMX non-root 模式。
**GPA 布局**(Phase 1.3 修复后):
| GPA | 用途 | 大小 |
|-----|------|------|
| `0x00400000 - 0x02FFFFFF` | initrd / boot_params | - |
| `0x03000000 - 0x03FFFFFF` | Linux guest initrd | 16MB+ |
| `0x04000000` | IPC 共享内存 | 1MB |
| `0x05000000+` | Linux guest RAM | - |
**e820 约定**:`linux_loader.c` 中 IPC 区域为 `reserved` 类型,RAM 移至 0x05000000。
**Hypercall ABI**:VMCALL,guest RAX=操作码,RDI/RSI/RDX=参数,返回值写回 RAX。9 种 op:PING/HELLO/SHM_INFO/CAP_VALIDATE/UTRW_READ/UTRW_WRITE/DRR_CHECKPOINT/CONSOLE_WRITE/CONSOLE_READ。
**IPC EXEC 协议**(消息号 16-20):EXEC_REQUEST/STDOUT/STDERR/EXIT/READY。`ipc_exec_request` ≤240 字节。
**virtio-mmio**:blk→IRQ5(0x35),net→IRQ6(0x36),MMIO 处理通过 EPT misconfig exit。
### PE/EXE 兼容层
四个组件(`CODE/UTSM/pe/`):
1. **pe_service.c** — 统一服务入口,通过 `reserved[4]` 暴露
2. **pe_loader.c** — PE32/PE32+ 解析映射重定位
3. **pe_shim.c** — IAT 拦截,`__attribute__((ms_abi))` shim,`__builtin_setjmp/longjmp` 异常恢复
4. **x86emu32.c** — x86-32 指令解释器
### shell `linux` 命令实现
`CODE/shell/main.c`:`cmd_linux` → `g_lxc_svc->exec()` → IPC → linux_resume → daemon fork+exec → pipe → IPC 回传 → 显示
---
## 桌面 UI 技术摘要(Winux-Kate "Sealed Arc" 设计语言)
### 架构
- `desktop.elf` 入口 `dsk_entry(dsk_boot_context)`,三层:顶栏(34px) + 页面宿主 + 任务栏
- 三页面:DASH/IDE/DESK(IM 页移除,自定义页 ID 从 4 起)
- DASHBOARD 四面板:TERM-01/02(35%) + EDITOR/FILES(65%)
### 配色方案(`deshab_ui.h:744-761`)
| 语义 | 常量 | 值 |
|------|------|-----|
| 主背景 | `KS_BG_PRIMARY` | `0xFF02040A` |
| 次级背景 | `KS_BG_SECONDARY` | `0xFF0A1428` |
| 主文本 | `KS_TEXT_PRIMARY` | `0xFFE8F4FC` |
| 暗文本 | `KS_TEXT_DIM` | `0xFF90B0C8` |
| 霓虹青 | `KS_ACCENT` | `0xFF00E5FF` |
| 霓虹绿 | `KS_ACCENT2` | `0xFF39FF14` |
| 危险红 | `KS_DANGER` | `0xFFFF4D6D` |
| 边框 | `KS_BORDER` | `0xFF2A6070` |
对比度:TEXT_DIM 在 BG_PRIMARY 上 10.8:1,BORDER 8.2:1。
### 渲染优化
- 双缓冲:`g_fb.fb` → `SPRITE_BUF_ADDR=0x7000000` 离屏,`flip_buffer()` 全屏 / `flip_rect()` 局部
- DBF 位图字体:`simhei_16/24/32.dbf`,GB2312 全部 6763 汉字 + ASCII,二分查找
- 视觉效果简化:5 层→3 层,扫描线改空函数,圆角改 0
- desktop.elf 体积 802KB→140KB(BSS 分离为 NOBITS)
### FILES 面板过滤
跳过 `.ELF` 可执行和 `FIRSTINI` 前缀,保留用户文件(USER.CON/NETCONF.CNF/FIRSTINT.XT)。
---
## Pacman 包管理方案
**核心矛盾**:pacman 依赖 glibc+POSIX+动态链接+网络+加密+压缩+可写 Unix FS,Deshab 均不提供。
**方案 C(IPC 委托执行)**:`SYSTEM/bin/` 放 stub → PATH 命中 → IPC 委托 Linux guest 执行 → 结果显示回 Deshab。
---
## BOOT_SEQUENCE 技术摘要
### 五阶段启动模型
| 阶段 | 代号 | 产物 | 锚点 |
|------|------|------|------|
| B0 | Ignis | utsm.elf 入内存 | — |
| B1 | Sigillum | 14 DKM 驱动 ACTIVE | `[UTSM] SELFTEST PASS` |
| B2 | Transitus | dsk_boot_context 就绪 | `[DSK] context ok` |
| B3 | Origo | firstInit 标志判定 | `[DSK] first init detected` 或 `SELFTEST PASS` |
| B4 | Excitas | 用户可交互 | `[DSK] jumping to FirstInit` |
### dsk_boot_context
```c
struct dsk_boot_context {
u64 magic; // 0x44534B31424F4F54 ("DSK1BOOT")
u32 abi_version; // 1
u32 size;
u64 flags; // FROM_UTSM | DKM_READY | FAT32_PATH
u64 hhdm_offset, rsdp_address;
u64 framebuffer_address/width/height/pitch/bpp;
u64 boot_modules_response;
u64 dkm_kernel_api, dkm_driver_table, driver_count;
u64 utsm_state, drr_state;
u64 memory_map, count, entry_size;
u64 kernel_stack_top;
u64 reserved[8]; // reserved[4]=pe_svc, reserved[5]=linux_compat_svc
};
```
ABI 约束:字段只能追加到 reserved 区。block_read 通过硬偏移 `api + 0xA8` 读取。
### 失败恢复链
- B2 FAT32 不可用 → 回退 Limine module
- B3 无 block device → 跳过 firstInit
- B1 required 驱动失败 → DRR recovery / panic
- B1 optional 驱动失败 → 标记 FAILED 继续
---
## 整体脉络
```
BOOT_SEQUENCE (B0→B4) → Winux-Kate 桌面 UI → Pacman 包管理
启动契约 用户交互层 软件生态
```
- UTSM 是契约源(dsk_boot_context 版本化传递)
- DKM 是能力供给(14 驱动暴露 kernel_api)
- DSK 是分发中枢(首次启动调度 + ELF 加载器)
- DRR 是恢复后盾(当前 stub,未来三级回退)
- SAS-R0 是约束源头(所有应用为静态 PIE ELF,无 POSIX/syscall/fork/exec)
@@ -0,0 +1,27 @@
# 自定义内核算法与驱动配置
## 现状
- **FUCK 文件**已存在(位于 ESP `/system/deshab64/FUCK`),当前为空
- **两个内核**:UTSM(首阶段,驱动清单加载/算法初始化)→ DSK(主内核,Logo/登录/桌面)
- **读取机制**:UTSM 和 DSK 的内嵌 FAT32 解析器目前只支持根目录 8.3 文件名查找,读 FUCK 需扩展子目录路径解析
- **UTSM 读取**:通过 Limine boot module 预加载(cmdline="fuck:config")
- **DSK 读取**:通过 FAT32 子目录遍历(路径 "SYSTEM /DESHAB64 /FUCK ")
- 缺失或为空时使用硬编码默认值
## 可插桩点
- **UTSM 启动流程**:arena/dma/drr/utsm_init/dkm manifest 加载/selftest/VMM+Linux guest
- **DSK 启动流程**:firstInit 检测/dev_mode/login/desktop
## 当前算法参数(编译期 `#define`,`config.h`)
- 段表 1024
- PCKC 8 密钥
- dirty shard 1024 页
- DRR 应急池 64KB
## INI 解析器
- `CODE/UTSM/kernel/ini_parser.h` / `ini_parser.c`
- 支持分区格式解析、key/value 查询、整型和布尔值便捷获取
@@ -0,0 +1,43 @@
# 规划项目开发工作
## UTSM VMM/Linux 双内核兼容层现状分析
### 各文件完成度
| 文件 | 职责 | 完成度 |
|------|------|--------|
| vmm.c | VMM 初始化、VMCS 管理、VMX 指令封装 | 已完成:vmm_init/vmm_self_test/VMCS 配置 |
| vmx.c | VMX 系统级支持 | 已完成:VMX 启用/禁用/CR 控制/MSR 读写 |
| vmexit.c | VM-Exit 分发 | 部分:HLT/CPUID/IO/EPT violation 已接线;缺 interrupt-window/preemption-timer(后已补全) |
| vmexit_asm.S | VM-Exit 汇编入口 | 已完成:16 GPR 保存/恢复 |
| linux_boot.c | Linux Guest 启动 | 已完成:VMCS 配置/vmlaunch |
| linux_loader.c | bzImage 加载 | 已完成:内核加载/页表/GDT/boot_params |
| linux_resume.c | Park-and-Resume | 已完成:vmresume 唤醒 parked guest |
| linux_compat.c | 兼容层服务 | 已完成:exec 实现(IPC + Resume) |
| hypercall.c | VMCALL 通信 | 部分:ping/hello/shm_info/console_write 已实现;cap_validate/utrw/drr 未实现 |
| ipc_shm.c | 共享内存环形队列 | 已完成:EPT 映射 + ring buffer 初始化 |
| ept.c | EPT 管理 | 已完成:初始化/GPA→HPA/按需分配 |
| virtio_mmio.c | MMIO 设备框架 | 已完成:寄存器读写 + 回调注册 + IRQ 注入 |
| virtio_blk.c | virtio-blk 模拟 | 部分:read/write 支持,缺 flush/discard |
| virtio_net.c | virtio-net 模拟 | 部分:基本 TX/RX,缺定时器驱动中断 |
### kernel_main 流程中 Linux 启动触发点
`kernel_main()` 初始化 `vmm_init()` + `vmm_self_test()` → 存在 bzImage 模块且 self_test 成功 → `linux_loader_init()` + `linux_launch()` → guest park → 返回 host → `dsk_load_and_jump()`
### 距离 Linux guest 在真机 VT-x 上跑到 shell 还差什么
| 缺失 | 说明 |
|------|------|
| VM-Exit 驱动 | interrupt window / preemption timer 模拟(后已补全) |
| 中断管理 | 自动中断注入 |
| 虚拟设备 | virtio 描述符链未完整 |
| rootfs | initramfs/rootfs 内部挂载 |
| 高级 hypercall | cap_validate / drr_checkpoint 等 |
| IO 模拟 | 部分仍为 stub |
| 真实设备接入 | guest 无法连接真实磁盘/网卡 |
| 调试支持 | 真实 guest 输出和串口日志 |
### 结论
当前系统处于 Phase 1.3,实现了基础双内核虚拟化。距真机跑起 Linux shell 还需:补全 vmexit 分发、提供真实 rootfs/initramfs、重构 virtio 驱动、补全 hypercall 服务、实现调度与并发。