diff --git a/CLAUDE.md b/CLAUDE.md index 0209990..1ccd8ef 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -175,7 +175,7 @@ kernel_api 已暴露能力:log, rsdp_address, fb_address/width/height/pitch/bp 1. **一期 F 系列收尾**: F2 统一控制台后端(fbcon.h 抽象已落,panic 已用)。(F1 莲花 panic / F3 跨平台 Makefile / F4 boot 分级自检 / F5 skip_firstinit 已完成) 2. **二期 U 系列**: @sealed 段标记、密文页 dump、selftest 覆盖率提升(~~UTRW Slow Path 真分支~~ U2 已完成:EPOCH/KEY_MISS 恢复 + MAC_FAILED/POISONED→DRR,selftest PASS)。 3. **三期 D 系列**: DKM 热卸载(引用计数)、裸机器码加载器、按名 API 导出表、彩色日志。 -4. **四期 R 系列收尾**: `drr_emergency_pool_kb`/`drr_recovery_log_size` 接线、segment/system 级回滚验证、PCQ per-cpu 多核。 +4. **四期 R 系列收尾**: segment/system 级回滚验证、PCQ per-cpu 多核。(~~drr_emergency_pool_kb/drr_recovery_log_size 接线~~ R3b 已完成,运行期钳位验证 PASS) 5. **五期 E 系列**: 启动莲花动画、假想时光键彩蛋、提交信息规范、风味 ISO。 6. **工程债(Phase 存档遗留)**: vector allocator/MSI-X、NVMe 高位 BAR、virtio-net virtqueue、DKM 零 warning。 diff --git a/CODE/UTSM/drr/drr_stub.c b/CODE/UTSM/drr/drr_stub.c index 12c49ee..4094407 100644 --- a/CODE/UTSM/drr/drr_stub.c +++ b/CODE/UTSM/drr/drr_stub.c @@ -217,25 +217,58 @@ void drr_emergency_reset(void) { drr_init(); } +/* ---- R3b: FUCK 配置接线(drr_apply_config 设置,drr_init 消费) ---- */ +static u64 g_cfg_pool_bytes; /* 0 = 编译期默认 */ +static u64 g_cfg_log_size; /* 0 = 编译期默认 */ + +void drr_apply_config(u64 pool_kb, u64 recovery_log_size) { + g_cfg_pool_bytes = pool_kb ? pool_kb * 1024ULL : 0; + g_cfg_log_size = recovery_log_size; + if (g_cfg_pool_bytes > DRR_EMERGENCY_POOL_SIZE) { + log_warn("[DRR] pool_kb exceeds compile-time pool, clamped"); + log_hex64("[DRR] compile-time=", DRR_EMERGENCY_POOL_SIZE); + g_cfg_pool_bytes = DRR_EMERGENCY_POOL_SIZE; + } +} + /* ---- 初始化 ---- */ void drr_init(void) { log_info("[DRR] init begin"); drr_memzero(&g_drr, sizeof(g_drr)); + /* R3b: 池上限 = min(编译期池, FUCK 配置);小于最小子缓冲布局时回退默认 */ g_drr.pool_offset = 0; g_drr.pool_limit = DRR_EMERGENCY_POOL_SIZE; + { + const u64 MIN_LAYOUT = + DRR_EMERGENCY_STACK_SIZE + DRR_RECOVERY_LOG_SIZE + + DRR_CKPT_META_BUF_SIZE + DRR_CRASH_BUF_SIZE + DRR_META_SLAB_SIZE; + if (g_cfg_pool_bytes && g_cfg_pool_bytes >= MIN_LAYOUT) { + g_drr.pool_limit = g_cfg_pool_bytes; + } else if (g_cfg_pool_bytes) { + log_warn("[DRR] pool_kb below minimum sub-buffer layout, default kept"); + log_hex64("[DRR] minimum=", MIN_LAYOUT); + } + } drr_root_key_generate(); g_drr.recovery_generation = 1; g_drr.heartbeat_interval = 1000; g_drr.active_slot = 0; /* A */ - /* 分配 Emergency Pool 子缓冲区 */ + /* 分配 Emergency Pool 子缓冲区(recovery log 大小可由 FUCK 配置) */ g_drr.stack_base = (u8 *)pool_alloc_internal(DRR_EMERGENCY_STACK_SIZE, 64); g_drr.stack_size = DRR_EMERGENCY_STACK_SIZE; g_drr.stack_ptr = DRR_EMERGENCY_STACK_SIZE; /* 栈从顶部向下增长 */ - g_drr.log_base = (drr_log_entry *)pool_alloc_internal(DRR_RECOVERY_LOG_SIZE, 64); - g_drr.log_capacity = DRR_RECOVERY_LOG_SIZE / sizeof(drr_log_entry); + u64 log_size = DRR_RECOVERY_LOG_SIZE; + if (g_cfg_log_size && g_cfg_log_size >= sizeof(drr_log_entry) && + g_cfg_log_size <= g_drr.pool_limit - g_drr.pool_offset) { + log_size = g_cfg_log_size; + } else if (g_cfg_log_size) { + log_warn("[DRR] recovery_log_size out of range, default kept"); + } + g_drr.log_base = (drr_log_entry *)pool_alloc_internal(log_size, 64); + g_drr.log_capacity = (u32)(log_size / sizeof(drr_log_entry)); g_drr.log_count = 0; g_drr.ckpt_meta_buf = (drr_checkpoint_meta *)pool_alloc_internal(DRR_CKPT_META_BUF_SIZE, 64); @@ -254,6 +287,8 @@ void drr_init(void) { g_drr.ckpt_b.version = DRR_CKPT_VERSION; g_drr.initialized = 1; + log_hex64("[DRR] pool_limit=", g_drr.pool_limit); + log_hex64("[DRR] log_capacity=", (u64)g_drr.log_capacity); /* ---- Phase 8: 快照区(dma 页,独立于普通堆;失败降级 metadata-only) ---- */ g_snap_ok = 0; diff --git a/CODE/UTSM/drr/drr_stub.o b/CODE/UTSM/drr/drr_stub.o index 248a3ea..064fe45 100644 Binary files a/CODE/UTSM/drr/drr_stub.o and b/CODE/UTSM/drr/drr_stub.o differ diff --git a/CODE/UTSM/include/utsm/drr.h b/CODE/UTSM/include/utsm/drr.h index ba3ebe1..7b2dac2 100644 --- a/CODE/UTSM/include/utsm/drr.h +++ b/CODE/UTSM/include/utsm/drr.h @@ -102,6 +102,10 @@ typedef struct { /* ---- 公共接口 ---- */ void drr_init(void); +/* R3b: FUCK [utsm] 配置接线(须在 drr_init 前调用;0 = 用编译期默认)。 + * pool_kb 钳位到编译期静态池上限(Emergency Pool 为编译期数组,运行期只 + * 能缩小可用量);recovery_log_size 钳位到池内剩余容量。 */ +void drr_apply_config(u64 pool_kb, u64 recovery_log_size); const u64 *drr_get_root_key(void); u64 drr_recovery_generation(void); void drr_report_fault(const char *reason); diff --git a/CODE/UTSM/kernel/main.c b/CODE/UTSM/kernel/main.c index e88fb5a..736f0f9 100644 --- a/CODE/UTSM/kernel/main.c +++ b/CODE/UTSM/kernel/main.c @@ -338,6 +338,9 @@ void kernel_main(void) { log_info("[UTSM] drr init begin"); INSTR_TS_DECL(ts_drr); INSTR_TS_BEGIN(ts_drr); + /* R3b: FUCK [utsm] drr_emergency_pool_kb / drr_recovery_log_size 接线 */ + drr_apply_config((u64)ini_get_int(cfg, "utsm", "drr_emergency_pool_kb", 0), + (u64)ini_get_int(cfg, "utsm", "drr_recovery_log_size", 0)); drr_init(); INSTR_TS_END(ts_drr, "drr_init"); log_info("[UTSM] drr init ok"); diff --git a/CODE/UTSM/kernel/main.o b/CODE/UTSM/kernel/main.o index 6012a26..7738440 100644 Binary files a/CODE/UTSM/kernel/main.o and b/CODE/UTSM/kernel/main.o differ diff --git a/SYSTEM/boot/utsm.elf b/SYSTEM/boot/utsm.elf index f67a9f4..b687214 100755 Binary files a/SYSTEM/boot/utsm.elf and b/SYSTEM/boot/utsm.elf differ diff --git a/SYSTEM/system/deshab64/FUCK b/SYSTEM/system/deshab64/FUCK index 55517cf..1c2bd73 100644 --- a/SYSTEM/system/deshab64/FUCK +++ b/SYSTEM/system/deshab64/FUCK @@ -93,3 +93,5 @@ pe_dll_search=1 + + diff --git a/build/configs/dev/FUCK b/build/configs/dev/FUCK index 55517cf..1c2bd73 100644 --- a/build/configs/dev/FUCK +++ b/build/configs/dev/FUCK @@ -93,3 +93,5 @@ pe_dll_search=1 + + diff --git a/docs/ROADMAP_INSANE.md b/docs/ROADMAP_INSANE.md index 08e1c70..ec2d57e 100644 --- a/docs/ROADMAP_INSANE.md +++ b/docs/ROADMAP_INSANE.md @@ -76,7 +76,7 @@ Deshab 最标志性的疯点——给空气上锁。 |------|------|---------|------|-------------------| | R1 | checkpoint 快照 | 时光键雏形 | ✅ | dirty shard 位图收集 → dma 页快照 + A/B 双槽 + CRC64 + 原子切换(`CODE/UTSM/drr/drr_core.c`) | | R2 | 看门狗计时器 | 卡死也能体面 | ✅ | register/kick/timeout → fault 路径 → 回滚/复位;负向测试 PASS(demo_fault=1) | -| R3 | Emergency Pool | 崩溃后有地方喘气 | ✅ | 编译期 64KB 独立静态池(独立于堆)+ bump 分配器;`drr_emergency_pool_kb` 键未接线 ⬜ | +| R3 | Emergency Pool | 崩溃后有地方喘气 | ✅ | 编译期 64KB 独立静态池(独立于堆)+ bump 分配器;`drr_emergency_pool_kb`/`drr_recovery_log_size` FUCK 接线 ✅(运行期钳位) | | R4 | A/B 镜像回滚 | 时光机第 1 台 | 🔶 | 页级回滚 + CRC verify + BLAKE2b keyed 页 MAC ✅;segment/system 级回滚待真实加密验证 | | R5 | PCQ 位图调度器(单核→多核) | 让"凭感觉"变 O(1) | 🔶 | O(1) 位图 + LAPIC tick + xv6 式切换 ✅;BSP-only,per-cpu 多核负载均衡 ⬜ | diff --git a/docs/STATUS.md b/docs/STATUS.md index 8ad302e..b670d45 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -70,7 +70,7 @@ | DRR checkpoint(R1) | ✅ | dirty shard → dma 页快照 + A/B 双槽 + CRC64 原子切换 | M4 QEMU 日志 | | DRR 回滚(R4) | 🔶 | page 级 + BLAKE2b keyed 页 MAC ✅;segment/system 级待验证 | M4 QEMU 日志 | | DRR 看门狗(R2) | ✅ | timeout 检出→回滚/复位;负向测试 PASS | M4 QEMU 日志 | -| Emergency Pool(R3) | ✅ | 64KB 编译期独立池;`drr_emergency_pool_kb` 键未接线 ⬜ | `include/utsm/drr.h` | +| Emergency Pool(R3) | ✅ | 64KB 编译期独立池;`drr_emergency_pool_kb`/`drr_recovery_log_size` FUCK 接线 ✅(运行期钳位) | `.build_tmp/qemu_serial_r3b.log` | ## 文档体系 diff --git a/docs/TASKBOARD.md b/docs/TASKBOARD.md index 873c7d5..5b4cdb1 100644 --- a/docs/TASKBOARD.md +++ b/docs/TASKBOARD.md @@ -32,7 +32,7 @@ - [x] R1 checkpoint 快照(A/B 双槽 + CRC64 + 原子切换) - [x] R2 看门狗(timeout 检出 + 回滚/复位,负向测试 PASS) - [x] R3 Emergency Pool(64KB 编译期独立池) -- [ ] R3b `drr_emergency_pool_kb` / `drr_recovery_log_size` FUCK 键接线 +- [x] R3b `drr_emergency_pool_kb` / `drr_recovery_log_size` FUCK 键接线(运行期钳位到编译期上限) - [ ] R4 A/B 回滚收尾(segment/system 级验证,依赖真实加密) - [ ] R5 PCQ 多核(per-cpu runqueue 负载均衡;BSP-only 🔶)