Files

212 lines
6.3 KiB
Markdown
Raw Permalink Normal View History

2026-07-29 10:26:25 +08:00
# 双内核架构与Linux内核交互
2026-07-31 13:53:49 +08:00
## 需求
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
UTSM + Linux 双内核架构,运行 Linux 内核虚拟机,修改 Linux 内核增加双核交互。参考设计: `D:\Code\ZT5`。
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
## 架构决策
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
- **虚拟化方案**: VMX/EPT 完整虚拟化
- **分工**: Linux 独占硬件,UTSM 作为监控核(hypervisor 模型)
- **Linux 版本**: 6.6 LTS
- **第一阶段范围**: virtio-console + 文件共享
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
---
## UTSM 目录结构
2026-07-29 10:26:25 +08:00
```
2026-07-31 13:53:49 +08:00
CODE/UTSM/
├── arch/x86_64/ # boot.S, idt.c, io.c, serial.c, limine.h
├── core/ # capability.c, dirty.c, dmp.c, process.c, segment.c, utsm_init.c
├── crypto/ # kdf.c, stream.c, tweak.c
├── dkm/ # boot_modules.c, console_early.c, dkm_core.c, kernel_api.c, manifest.c
├── include/utsm/ # 所有头文件(arena.h, dkm.h, vmm.h, ept.h, hypercall.h, ipc_shm.h 等)
├── kernel/ # block.c, dsk_loader.c, log.c, main.c, net.c, panic.c
├── mm/ # arena.c, dma.c
├── pe/ # pe_loader.c, pe_shim.c, x86emu32.c, pe_service.c
├── vmm/ # vmx.c, ept.c, vmexit.c, vmm.c, vmexit_asm.S, linux_boot.c,
│ # linux_loader.c, linux_resume.c, ipc_shm.c, hypercall.c,
│ # linux_compat.c, virtio_mmio.c, virtio_blk.c, virtio_net.c
├── MAKEFILE, linker.ld
2026-07-29 10:26:25 +08:00
```
---
2026-07-31 13:53:49 +08:00
## Phase 1.1: VMX 基础设施
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
### 核心文件
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
| 文件 | 职责 |
|------|------|
| `vmm/vmx.c` / `include/utsm/vmx.h` | VMXON/VMXOFF, VMCS 读写, EPT 页表管理 |
| `vmm/ept.c` / `include/utsm/ept.h` | EPT 4级页表创建/映射/遍历, `ept_gpa_to_hpa()` |
| `vmm/vmm.c` | VMM 初始化, VMCS 配置(Host/Guest/Controls), 自测程序 |
| `vmm/vmexit_asm.S` | VM-Exit 汇编入口: 保存/恢复全部 16 个 guest GPR 到 `g_guest_regs` |
| `vmm/vmexit.c` | VM-Exit 分发: HLT/EPTViolation/异常/CPUID/IO/MSR/VMCALL |
### 关键 VMCS 字段(vmx.h)
```c
// Host State
VMCS_HOST_CR3, VMCS_HOST_RIP, VMCS_HOST_RSP, VMCS_HOST_GDTR_BASE, VMCS_HOST_TR_SEL
// Guest State
VMCS_GUEST_CR0/CR3/CR4, VMCS_GUEST_RIP, VMCS_GUEST_RFLAGS
VMCS_GUEST_ES/CS/SS/DS/FS/GS/TR/LDTR_SEL
VMCS_GUEST_GDTR/LDTR_BASE/LIMIT
VMCS_GUEST_IA32_EFER, VMCS_HOST_IA32_EFER
// Controls
VMCS_PIN_CONTROLS, VMCS_CPU_CONTROLS, VMCS_CPU_SECONDARY
VMCS_ENTRY_CONTROLS, VMCS_EXIT_CONTROLS, VMCS_EPT_POINTER
```
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
### EPT 映射
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
```c
void ept_identity_map(u64 gpa, u64 permissions); // 恒等映射 GPA→HPA
u64 ept_gpa_to_hpa(u64 gpa); // 4 级 EPT walk(支持 4KB/2MB/1GB 页)
```
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
### 自测流程
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
1. `vmm_init()` → VMXON + EPT 初始化
2. `vmm_self_test()` → 创建测试 guest VMCS, vmlaunch
3. Guest 执行 HLT → vmexit handler 设置 `g_guest_terminated=1`
4. 汇编检测终止标志 → 恢复 host 栈返回
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
**注意**: VMX 需要 VT-x 硬件支持,QEMU TCG 不支持 VMX。WHPX 在 OVMF 下崩溃。测试需真实硬件。
2026-07-29 10:26:25 +08:00
---
2026-07-31 13:53:49 +08:00
## Phase 1.2: Linux Loader
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
### 核心文件
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
| 文件 | 职责 |
|------|------|
| `vmm/linux_loader.c` / `include/utsm/linux_loader.h` | bzImage 解析, boot_params 设置, EPT 映射 |
| `vmm/linux_boot.c` | Linux guest VMCS 配置 + vmlaunch |
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
### GPA 内存布局
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
```
0x00000000-0x003FFFFF 低 RAM (boot_params, GDT 等)
0x00400000 boot_params GPA
0x00600000 Guest GDT
0x01000000 bzImage kernel
0x03000000 initrd (原 0x04000000, 修复冲突后移至 0x03000000)
0x04000000-0x04FFFFFF IPC 共享内存 (1MB, e820 reserved)
0x05000000-0x08FFFFFF Guest RAM (64MB)
0x0A000000-0x0A0001FF virtio-mmio #0 (blk)
0x0A000200-0x0A0003FF virtio-mmio #1 (net)
```
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
### Linux Boot Protocol
```c
struct setup_header {
u8 setup_sects, root_flags, syssize[4];
u16 ram_size, vid_mode, root_dev;
u8 jump[2], header[4], version[2];
u32 realmode_swtch, start_sys, kernel_version;
u8 type_of_loader;
u8 loadflags; // LOADED_HIGH bit
u16 initrd_addr_max;
// ... ext_* fields
};
struct boot_params {
struct screen_info screen_info;
struct apm_bios_info apm_bios_info;
u8 pad2[4];
u64 tboot_addr;
u8 pad3[24];
struct e820_entry e820_map[E820_MAX_ENTRIES];
// ... setup_header at end
};
```
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
### Linux Boot 流程
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
1. 从 Limine boot module 获取 bzImage/initrd
2. 解析 setup_header, 验证 magic `HdrS`
3. 设置 boot_params: e820 内存图 + cmdline + initrd 地址/大小
4. EPT 映射所有 GPA 区域
5. VMCS 配置 guest 状态 (CR0/3/4, segments, EFER.LME+LMA)
6. vmlaunch → guest 进入 64 位模式
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
---
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
## Phase 1.3: IPC 骨架
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
### IPC 共享内存(1MB @ GPA 0x04000000)
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
```c
struct utsm_ipc_shm {
u32 magic; // UTSM_IPC_MAGIC
u32 version;
u32 host_to_guest_head, host_to_guest_tail;
u32 guest_to_host_head, guest_to_host_tail;
u8 ring_buf[UTSM_IPC_RING_SIZE];
u8 payload_pool[UTSM_IPC_PAYLOAD_SIZE]; // 1MB, 未用
};
```
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
### Hypercall ABI(VMCALL)
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
Guest 通过 `vmcall(rax=UTSM_HCALL_MAGIC, rdi=op, rsi=arg1, rdx=arg2)` 调用。
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
```c
#define UTSMB_HCALL_PING 0x01
#define UTSMB_HCALL_HELLO 0x02
#define UTSMB_HCALL_SHM_INFO 0x03
#define UTSMB_HCALL_CAP_VALIDATE 0x04
#define UTSMB_HCALL_UTRW_READ 0x05
#define UTSMB_HCALL_UTRW_WRITE 0x06
#define UTSMB_HCALL_DRR_CHECKPOINT 0x07
#define UTSMB_HCALL_CONSOLE_WRITE 0x08
#define UTSMB_HCALL_CONSOLE_READ 0x09
```
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
### Linux 侧驱动(utsm_hcall.c)
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
- `/dev/utsm` 字符设备
- ioctl: RECV_MSG / SEND_MSG / SHM_MMAP
- VMCALL 汇编封装
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
### UTSM 启动顺序(kernel/main.c)
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
```c
vmm_init() → vmm_self_test() → ipc_shm_init() → linux_loader_init()
→ linux_launch() → linux_compat_init() → dsk_load_and_jump()
```
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
---
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
## Limine 配置
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
`SYSTEM/limine/limine.conf` 中 Linux 模块默认注释(文件不存在时 Limine 启动失败):
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
```
# /boot/linux-bzImage: cmdline="fuck:config console=ttyS0 nohlt idle=poll"
# /boot/linux-initrd.img:
```
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
build.sh 成功后自动取消注释。
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
---
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
## Linux 构建
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
`CODE/linux/build.sh` 脚本: 克隆 Linux 6.6 → 安装 UTSM 驱动 → defconfig → bzImage → initramfs → 拷贝产物。
2026-07-29 10:26:25 +08:00
2026-07-31 13:53:49 +08:00
需 WSL 环境,`KCFLAGS='-std=gnu17'` 修复 gcc 15 C23 兼容性。
2026-07-29 10:26:25 +08:00
---
2026-07-31 13:53:49 +08:00
## 构建验证
- utsm.elf 编译成功(87120 字节),新代码零 warning
- VMX 自测在 TCG 下优雅降级(打印 "VMX not available")
- 真实 VT-x 硬件测试待执行