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