# 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
```