Files
Deshab-OS/CODE/dsk
cool 6287513794 feat: 添加 Linux 预览后端和 Notes 应用预览版本
- 创建 desktop_app_linux.h 作为跨平台后端抽象层
- 创建 notes_preview.c 使用 5x7 位图字体渲染
- 添加 Makefile.linux
构建脚本
- 添加 README_LINUX_PREVIEW.md 使用说明- 修复键盘映射、字符渲染、文本输入显示等问题
2026-08-05 13:15:46 +08:00
..
2026-07-28 12:00:02 +08:00
2026-07-31 13:53:49 +08:00
2026-07-31 13:53:49 +08:00
2026-07-31 13:53:49 +08:00
2026-07-31 13:53:49 +08:00

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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

```