367 lines
8.4 KiB
Plaintext
367 lines
8.4 KiB
Plaintext
# DSK 主内核说明
|
||||
|
|
|
|||
|
|
`CODE/dsk` 是 Deshab 的主内核工程目录,目标产物为:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
CODE/dsk -> SYSTEM/system/deshab64/deshab.elf
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
当前启动链路分为两层:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
bootloader
|
|||
|
|
-> SYSTEM/boot/utsm.elf
|
|||
|
|
UTSM 首阶段内核 / DKM 驱动加载 / 平台发现
|
|||
|
|
-> SYSTEM/system/deshab64/deshab.elf
|
|||
|
|
DSK 主内核
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
也就是说,`utsm.elf` 不是最终长期运行的完整主内核,而是当前已经具备启动、封缄内存、DKM 驱动加载、平台发现和早期系统服务能力的前置内核阶段。后续 UTSM 需要继续执行到 `deshab.elf`,把控制权交给 DSK 主内核。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 模块定位
|
|||
|
|
|
|||
|
|
DSK 是 Deshab 的主内核,负责承接 UTSM 阶段已经建立的系统基础,并进入完整内核运行期。
|
|||
|
|
|
|||
|
|
DSK 的职责:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
1. 接收 UTSM 传入的 boot context / platform context。
|
|||
|
|
2. 接管主调度器、内存管理、系统服务和长期运行状态。
|
|||
|
|
3. 使用 UTSM/DKM 已完成的平台发现结果。
|
|||
|
|
4. 继续使用或接管 DKM 驱动状态。
|
|||
|
|
5. 推进真实块设备、网络、VFS 和用户任务模型。
|
|||
|
|
6. 与 DRR 恢复根协作,支持 checkpoint / recovery / rollback。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
DSK 不应重复做已经由 UTSM 阶段完成的早期工作,例如:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
- Limine request 原始解析
|
|||
|
|
- early serial 初始化
|
|||
|
|
- 早期 arena 初始化
|
|||
|
|
- DKM manifest 的首轮 stage 加载
|
|||
|
|
- 纯 discovery 型平台枚举
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
DSK 应关注从“可启动实验内核”进入“可长期运行主内核”。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. 产物路径
|
|||
|
|
|
|||
|
|
主内核 ELF 固定输出到:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
SYSTEM/system/deshab64/deshab.elf
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
建议目录语义:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
SYSTEM/
|
|||
|
|
boot/
|
|||
|
|
utsm.elf # bootloader 直接加载的首阶段内核
|
|||
|
|
|
|||
|
|
system/
|
|||
|
|
deshab64/
|
|||
|
|
deshab.elf # DSK 主内核
|
|||
|
|
|
|||
|
|
driver/
|
|||
|
|
manifest.json
|
|||
|
|
... *.drv # DKM 驱动模块
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`deshab64` 表示当前主内核目标架构为 x86_64 long mode。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. UTSM 到 DSK 的执行关系
|
|||
|
|
|
|||
|
|
当前 UTSM 已完成:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
- long mode C 入口
|
|||
|
|
- serial log
|
|||
|
|
- UTSM/PCKC/UTRW selftest
|
|||
|
|
- IDT 0-47
|
|||
|
|
- PIC IRQ fallback
|
|||
|
|
- irq_register
|
|||
|
|
- Limine RSDP/framebuffer/module/HHDM request
|
|||
|
|
- DKM/DSM 外部 .drv 加载
|
|||
|
|
- 14/14 真实 DKM 驱动 discovery/加载闭环
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
下一步需要让 UTSM 在完成早期阶段后定位并加载:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
/system/deshab64/deshab.elf
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
推荐执行链:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
kernel_main()
|
|||
|
|
-> serial_init()
|
|||
|
|
-> idt_init()
|
|||
|
|
-> utsm_init()
|
|||
|
|
-> dkm_init()
|
|||
|
|
-> dsm_load_from_manifest()
|
|||
|
|
-> utsm_selftest()
|
|||
|
|
-> dsk_load_main_kernel("/system/deshab64/deshab.elf")
|
|||
|
|
-> dsk_build_boot_context()
|
|||
|
|
-> dsk_jump_entry()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
DSK 入口不应假设自己由 bootloader 直接加载,而应假设由 UTSM 传入上下文。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. DSK Boot Context
|
|||
|
|
|
|||
|
|
UTSM 跳转 DSK 时应传入一个明确版本化的上下文结构。
|
|||
|
|
|
|||
|
|
建议第一版结构:
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
#define DSK_BOOT_MAGIC 0x44534B31424F4F54ULL /* "DSK1BOOT" */
|
|||
|
|
#define DSK_BOOT_ABI_VERSION 1
|
|||
|
|
|
|||
|
|
struct dsk_boot_context {
|
|||
|
|
uint64_t magic;
|
|||
|
|
uint32_t abi_version;
|
|||
|
|
uint32_t size;
|
|||
|
|
|
|||
|
|
uint64_t flags;
|
|||
|
|
|
|||
|
|
uint64_t hhdm_offset;
|
|||
|
|
|
|||
|
|
uint64_t rsdp_address;
|
|||
|
|
|
|||
|
|
uint64_t framebuffer_address;
|
|||
|
|
uint64_t framebuffer_width;
|
|||
|
|
uint64_t framebuffer_height;
|
|||
|
|
uint64_t framebuffer_pitch;
|
|||
|
|
uint32_t framebuffer_bpp;
|
|||
|
|
uint32_t reserved_fb;
|
|||
|
|
|
|||
|
|
uint64_t boot_modules_response;
|
|||
|
|
|
|||
|
|
uint64_t dkm_kernel_api;
|
|||
|
|
uint64_t dkm_driver_table;
|
|||
|
|
uint64_t dkm_driver_count;
|
|||
|
|
|
|||
|
|
uint64_t utsm_state;
|
|||
|
|
uint64_t drr_state;
|
|||
|
|
|
|||
|
|
uint64_t memory_map;
|
|||
|
|
uint64_t memory_map_count;
|
|||
|
|
uint64_t memory_map_entry_size;
|
|||
|
|
|
|||
|
|
uint64_t kernel_stack_top;
|
|||
|
|
uint64_t reserved[8];
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
传参建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
RDI = struct dsk_boot_context *
|
|||
|
|
RSI = 0
|
|||
|
|
RDX = 0
|
|||
|
|
interrupt state = disabled 或明确约定
|
|||
|
|
paging = UTSM 当前页表
|
|||
|
|
address model = higher-half + HHDM
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
第一版可以只填必要字段:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
magic / abi_version / size
|
|||
|
|
hhdm_offset
|
|||
|
|
rsdp_address
|
|||
|
|
framebuffer 信息
|
|||
|
|
boot_modules_response
|
|||
|
|
dkm_kernel_api
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
其余字段后续逐步补齐。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. DSK ELF 加载要求
|
|||
|
|
|
|||
|
|
`deshab.elf` 建议先采用 ELF64 executable 或 relocatable-friendly layout。
|
|||
|
|
|
|||
|
|
第一版 loader 可只支持最小集合:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
ELFCLASS64
|
|||
|
|
ELFDATA2LSB
|
|||
|
|
EM_X86_64
|
|||
|
|
ET_EXEC 或 ET_DYN(二选一先固定)
|
|||
|
|
PT_LOAD segment
|
|||
|
|
PF_R / PF_W / PF_X
|
|||
|
|
入口 e_entry
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
推荐第一版限制:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
1. 不支持动态链接。
|
|||
|
|
2. 不支持 TLS。
|
|||
|
|
3. 不支持用户态权限切换。
|
|||
|
|
4. 不支持 demand paging。
|
|||
|
|
5. 不支持 symbol resolution。
|
|||
|
|
6. 所有 PT_LOAD 一次性复制/清零。
|
|||
|
|
7. 入口地址由 e_entry 给出。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
加载路径:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
1. 从 bootfs/VFS 或 Limine module 查找 /system/deshab64/deshab.elf。
|
|||
|
|
2. 校验 ELF header。
|
|||
|
|
3. 计算 PT_LOAD 覆盖范围。
|
|||
|
|
4. 分配或确认目标虚拟地址范围。
|
|||
|
|
5. 复制 file-backed bytes。
|
|||
|
|
6. 清零 memsz - filesz。
|
|||
|
|
7. 设置段权限(第一版可沿用当前 RWX 简化策略)。
|
|||
|
|
8. 构造 dsk_boot_context。
|
|||
|
|
9. 跳转 e_entry。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. DSK 初始功能目标
|
|||
|
|
|
|||
|
|
第一阶段 DSK 不追求完整功能,先做可验证闭环。
|
|||
|
|
|
|||
|
|
最小启动目标:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
1. 接收 dsk_boot_context。
|
|||
|
|
2. 校验 magic / abi_version / size。
|
|||
|
|
3. 复用 serial log 或 framebuffer log。
|
|||
|
|
4. 打印 DSK boot banner。
|
|||
|
|
5. 打印 hhdm / rsdp / framebuffer / driver_count。
|
|||
|
|
6. 执行 DSK selftest。
|
|||
|
|
7. 返回或 halt。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
成功日志建议:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
[DSK] boot
|
|||
|
|
[DSK] context ok
|
|||
|
|
[DSK] hhdm offset=...
|
|||
|
|
[DSK] framebuffer=...
|
|||
|
|
[DSK] dkm drivers=...
|
|||
|
|
[DSK] SELFTEST PASS
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. 后续主内核路线
|
|||
|
|
|
|||
|
|
DSK 阶段建议按以下顺序推进:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
P0: DSK ELF loader + dsk_boot_context + 跳转入口
|
|||
|
|
P1: 物理页分配器 + 页表/MMIO 映射接口
|
|||
|
|
P2: DMA buffer / cache barrier / IOMMU 预留接口
|
|||
|
|
P3: AHCI IDENTIFY/READ 已具备最小 DMA 验证路径;继续推进 AHCI block provider 与 NVMe admin queue/identify
|
|||
|
|
P4: FAT32 接入真实 block provider,替代 test.fat32
|
|||
|
|
P5: IDT 256 vectors + APIC/IOAPIC/MSI IRQ backend
|
|||
|
|
P6: e1000 / virtio_net RX-TX 数据路径
|
|||
|
|
P7: 主调度器 SAS-R0-PCQ 与任务模型
|
|||
|
|
P8: DRR checkpoint / recovery log / A-B rollback
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
优先级原则:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
先让 UTSM 能加载并跳到 DSK。
|
|||
|
|
再补内存/MMIO/DMA。
|
|||
|
|
再做块设备真实读取。
|
|||
|
|
再迁移文件系统和网络数据路径。
|
|||
|
|
最后进入调度器和恢复系统深化。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. 与 UTSM 的边界
|
|||
|
|
|
|||
|
|
UTSM 保留职责:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
- 封缄内存模型
|
|||
|
|
- UTRW 明文读写路径
|
|||
|
|
- DMP/PCKC
|
|||
|
|
- DKM 首轮驱动加载
|
|||
|
|
- early recovery hook
|
|||
|
|
- DSK 加载前的早期平台发现
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
DSK 接管职责:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
- 主内核生命周期
|
|||
|
|
- 完整内存管理
|
|||
|
|
- 完整 IRQ backend
|
|||
|
|
- 块设备与文件系统运行期
|
|||
|
|
- 网络栈运行期
|
|||
|
|
- 调度器和任务模型
|
|||
|
|
- 系统调用或内核服务入口
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
二者关系不是互斥,而是阶段化:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
UTSM = boot/runtime substrate
|
|||
|
|
DSK = main kernel runtime
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 9. 当前待办
|
|||
|
|
|
|||
|
|
短期需要实现:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
1. 已完成:build.ps1 增加 CODE/dsk -> SYSTEM/system/deshab64/deshab.elf 构建目标。
|
|||
|
|
2. 已完成:SYSTEM/boot/limine.conf 预加载 /system/deshab64/deshab.elf。
|
|||
|
|
3. 已完成:UTSM 中实现 DSK ELF64 PT_LOAD loader,优先通过 `kernel_api.block` + 内嵌 FAT32 解析从真实块设备读取 `DESHAB.ELF`(SATA FAT32 盘已验证);无块设备时自动回退 Limine boot module 预加载。
|
|||
|
|
4. 已完成:定义 dsk_boot_context 头文件,UTSM 与 DSK 共用。
|
|||
|
|
5. 已完成:编写 DSK 最小入口,打印 boot banner 和 SELFTEST PASS。
|
|||
|
|
6. 已完成:QEMU 验证从 UTSM 继续执行到 DSK。
|
|||
|
|
7. 已完成:把 "Limine 预加载 deshab.elf" 替换为 UTSM 通过 FAT32 block provider 读取。
|
|||
|
|
后续:在 FAT32 中支持子目录路径,统一 DSK 加载与 VFS 路径语义。
|
|||
|
|
8. 下一步:按“块设备优先”推进 AHCI/NVMe IDENTIFY/READ 和真实 FAT32 挂载。
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
当前验证日志:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
[UTSM] SELFTEST PASS
|
|||
|
|
[UTSM] loading DSK
|
|||
|
|
[UTSM] DSK module size=...
|
|||
|
|
[UTSM] DSK image base=...
|
|||
|
|
[UTSM] DSK entry=...
|
|||
|
|
[UTSM] jumping to DSK
|
|||
|
|
[DSK] boot
|
|||
|
|
[DSK] context ok
|
|||
|
|
[DSK] SELFTEST PASS
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
验证标准:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
[UTSM] SELFTEST PASS
|
|||
|
|
[UTSM] loading DSK
|
|||
|
|
[DSK] boot
|
|||
|
|
[DSK] context ok
|
|||
|
|
[DSK] SELFTEST PASS
|
|||
|
|
```
|