Files
Deshab-OS/docs/上下文/26072901/自定义内核算法与驱动配置.md
T
2026-08-05 13:58:13 +08:00

93 lines
4.7 KiB
Markdown
Raw Blame History

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.
# 自定义内核算法与驱动配置
> **Workspace:** d:\Code\Deshab
---
## 任务目标
为系统增加"自定义内核"算法,支持设置内核各项算法和驱动配置。内核启动时获取 `SYSTEM/system/deshab64/FUCK` 文件里的配置信息,启用相关算法和驱动。
## 现状分析
- **FUCK 文件**已存在(当前为空),位于 ESP 的 `/system/deshab64/FUCK`
- **两个内核**:UTSM(首阶段)→ DSK(主内核),各自有独立的 FAT32 解析器
- **读取机制**:UTSM 和 DSK 的 FAT32 解析器目前只支持根目录 8.3 文件名,读 FUCK 需扩展子目录路径解析
- **可插桩点**:UTSM 启动流程(arena/dma/drr/utsm_init/dkm manifest/selftest/VMM+Linux)+ DSK 启动流程(firstInit/dev_mode/login/desktop)
- **算法参数**:`config.h` 编译期 `#define`(段表 1024、PCKC 8 密钥、dirty shard 1024 页、DRR 应急池 64KB 等)
## 配置格式
INI 分区式(`[section]` + `key=value`,`#`/`;` 注释)
### 四类配置
| Section | 键示例 | 说明 |
|---------|--------|------|
| `[boot]` | selftest=1, vmm=1, linux_guest=1 | 启动流程开关 |
| `[drivers]` | nvme=0, virtio_net=0, ath9k=0 | 驱动加载开关 |
| `[utsm]` | max_segments=1024, max_capabilities=64, max_pckc_keys=8, arena_size=0x100000, dirty_shard_pages=1024 | 算法参数(运行期全局变量覆盖编译期默认值) |
| `[dsk]` | show_logo=1, skip_login=0, mouse_init=1, netman=1, dev_mode=0 | DSK 行为开关 |
## 新增文件
| 文件 | 说明 |
|------|------|
| `CODE/UTSM/kernel/ini_parser.h` | INI 配置解析器头文件(`ini_config` 结构体 + `ini_parse/ini_get/ini_get_int/ini_get_bool` 接口) |
| `CODE/UTSM/kernel/ini_parser.c` | INI 配置解析器实现(freestanding,无堆分配,无 libc 依赖,最多 64 条配置项) |
## 修改文件
### UTSM 侧
| 文件 | 改动 |
|------|------|
| `kernel/main.c` | `utsm_load_fuck_config()`(通过 Limine boot module cmdline=`fuck:config` 读取)、运行期全局变量定义、`utsm_apply_config()`、`kernel_main()` 全流程插桩 |
| `kernel/dsk_loader.c` | `fat32_find_in_dir()` 子目录项查找 + `fat32_read_path()` 子目录路径遍历 |
| `include/utsm/config.h` | 编译期常量改为运行期全局变量声明(`g_utsm_max_segments` 等)+ 保留旧宏名兼容 |
| `core/utsm_init.c` | 使用 `g_utsm_max_segments` 运行期变量替代 `UTSM_MAX_SEGMENTS` 宏 |
### DKM 侧
| 文件 | 改动 |
|------|------|
| `dkm/manifest.c` | `dsm_load_by_manifest()` → `dsm_load_by_manifest_ex(cfg)`,驱动循环中增加 `[drivers]` 开关检查 |
### DSK 侧
| 文件 | 改动 |
|------|------|
| `dsk/main.c` | 内嵌 `dsk_ini_*` INI 解析器 + `fat32_find_in_dir()` + `fat32_read_path()` + `dsk_spinner_and_check()` 全流程插桩(FUCK 读取 + show_logo/skip_login/mouse_init/netman/dev_mode 开关) |
### 系统文件
| 文件 | 改动 |
|------|------|
| `SYSTEM/system/deshab64/FUCK` | 写入 INI 格式默认配置(`[boot]/[drivers]/[utsm]/[dsk]` 四分区) |
| `SYSTEM/limine/limine.conf` | 添加 `MODULE_PATH=boot():/system/deshab64/FUCK` + `MODULE_CMDLINE=fuck:config` |
### 文档
| 文件 | 改动 |
|------|------|
| `CLAUDE.md` | 核心架构新增 FUCK 条目 + 重要文件新增 FUCK 和 ini_parser 说明 |
| `docs/ARCHITECTURE.md` | 启动链路图标注配置读取点 + 新增 §10"内核启动配置(FUCK)"章节 |
## 读取通道
- **UTSM**:经 Limine boot module(`limine.conf` 已注册 `module_cmdline: fuck:config`)
- **DSK**:经 FAT32 自读(AHCI block provider 在 UTSM 读配置时尚未加载,故不能用同一通道)。DSK 侧有根目录回退:先 `/SYSTEM/DESHAB64/FUCK`,失败再试根目录 `FUCK`
## 已接入的真实插桩点
1. `[utsm]` 算法参数 → 5 个运行期全局变量覆盖编译期默认值;`max_segments` 被 `core/utsm_init.c` 真实消费(串口确认 `max_segments=0x400`)
2. `[drivers]` 驱动过滤 → `dsm_load_by_manifest_ex` 按名跳过(串口确认 nvme/virtio_net/ath9k 被 `disabled by FUCK`)
3. `[boot]` selftest/vmm/linux_guest → 三个启动开关均生效
4. DSK 侧 `[dsk]` show_logo/skip_login/mouse_init/netman + `[boot]` dev_mode
## 需要用户决定的事项
1. **SATA 镜像布局**:`mkfat32.ps1` 生成的测试盘是扁平布局,无 `/system/deshab64/` 路径,DSK 侧配置在 SATA 场景暂时只能回退默认值
2. **算法参数消费点**:`max_capabilities/max_pckc_keys/arena_size/dirty_shard_pages` 已解析到全局变量,但消费改造未做,目前仅 `max_segments` 真实生效
3. **已定义但未接线的键**:`[dsk] default_shell`、`[utsm] drr_*`、`vmm.linux_memory_mb` 等——框架可查,插桩点待用户明确语义后接入