212 lines
6.3 KiB
Markdown
212 lines
6.3 KiB
Markdown
# 双内核架构与Linux内核交互
|
||
|
||
## 需求
|
||
|
||
UTSM + Linux 双内核架构,运行 Linux 内核虚拟机,修改 Linux 内核增加双核交互。参考设计: `D:\Code\ZT5`。
|
||
|
||
## 架构决策
|
||
|
||
- **虚拟化方案**: VMX/EPT 完整虚拟化
|
||
- **分工**: Linux 独占硬件,UTSM 作为监控核(hypervisor 模型)
|
||
- **Linux 版本**: 6.6 LTS
|
||
- **第一阶段范围**: virtio-console + 文件共享
|
||
|
||
---
|
||
|
||
## UTSM 目录结构
|
||
|
||
```
|
||
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
|
||
```
|
||
|
||
---
|
||
|
||
## Phase 1.1: VMX 基础设施
|
||
|
||
### 核心文件
|
||
|
||
| 文件 | 职责 |
|
||
|------|------|
|
||
| `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
|
||
```
|
||
|
||
### EPT 映射
|
||
|
||
```c
|
||
void ept_identity_map(u64 gpa, u64 permissions); // 恒等映射 GPA→HPA
|
||
u64 ept_gpa_to_hpa(u64 gpa); // 4 级 EPT walk(支持 4KB/2MB/1GB 页)
|
||
```
|
||
|
||
### 自测流程
|
||
|
||
1. `vmm_init()` → VMXON + EPT 初始化
|
||
2. `vmm_self_test()` → 创建测试 guest VMCS, vmlaunch
|
||
3. Guest 执行 HLT → vmexit handler 设置 `g_guest_terminated=1`
|
||
4. 汇编检测终止标志 → 恢复 host 栈返回
|
||
|
||
**注意**: VMX 需要 VT-x 硬件支持,QEMU TCG 不支持 VMX。WHPX 在 OVMF 下崩溃。测试需真实硬件。
|
||
|
||
---
|
||
|
||
## Phase 1.2: Linux Loader
|
||
|
||
### 核心文件
|
||
|
||
| 文件 | 职责 |
|
||
|------|------|
|
||
| `vmm/linux_loader.c` / `include/utsm/linux_loader.h` | bzImage 解析, boot_params 设置, EPT 映射 |
|
||
| `vmm/linux_boot.c` | Linux guest VMCS 配置 + vmlaunch |
|
||
|
||
### GPA 内存布局
|
||
|
||
```
|
||
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)
|
||
```
|
||
|
||
### 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
|
||
};
|
||
```
|
||
|
||
### Linux Boot 流程
|
||
|
||
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 位模式
|
||
|
||
---
|
||
|
||
## Phase 1.3: IPC 骨架
|
||
|
||
### IPC 共享内存(1MB @ GPA 0x04000000)
|
||
|
||
```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, 未用
|
||
};
|
||
```
|
||
|
||
### Hypercall ABI(VMCALL)
|
||
|
||
Guest 通过 `vmcall(rax=UTSM_HCALL_MAGIC, rdi=op, rsi=arg1, rdx=arg2)` 调用。
|
||
|
||
```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
|
||
```
|
||
|
||
### Linux 侧驱动(utsm_hcall.c)
|
||
|
||
- `/dev/utsm` 字符设备
|
||
- ioctl: RECV_MSG / SEND_MSG / SHM_MMAP
|
||
- VMCALL 汇编封装
|
||
|
||
### UTSM 启动顺序(kernel/main.c)
|
||
|
||
```c
|
||
vmm_init() → vmm_self_test() → ipc_shm_init() → linux_loader_init()
|
||
→ linux_launch() → linux_compat_init() → dsk_load_and_jump()
|
||
```
|
||
|
||
---
|
||
|
||
## Limine 配置
|
||
|
||
`SYSTEM/limine/limine.conf` 中 Linux 模块默认注释(文件不存在时 Limine 启动失败):
|
||
|
||
```
|
||
# /boot/linux-bzImage: cmdline="fuck:config console=ttyS0 nohlt idle=poll"
|
||
# /boot/linux-initrd.img:
|
||
```
|
||
|
||
build.sh 成功后自动取消注释。
|
||
|
||
---
|
||
|
||
## Linux 构建
|
||
|
||
`CODE/linux/build.sh` 脚本: 克隆 Linux 6.6 → 安装 UTSM 驱动 → defconfig → bzImage → initramfs → 拷贝产物。
|
||
|
||
需 WSL 环境,`KCFLAGS='-std=gnu17'` 修复 gcc 15 C23 兼容性。
|
||
|
||
---
|
||
|
||
## 构建验证
|
||
|
||
- utsm.elf 编译成功(87120 字节),新代码零 warning
|
||
- VMX 自测在 TCG 下优雅降级(打印 "VMX not available")
|
||
- 真实 VT-x 硬件测试待执行
|