This commit is contained in:
xyou
2026-07-31 13:53:49 +08:00
parent 5ea84fac97
commit f52157b7af
241 changed files with 26843 additions and 8155 deletions
@@ -0,0 +1,92 @@
# 自定义内核算法与驱动配置
> **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` 等——框架可查,插桩点待用户明确语义后接入