中断路由 (B7): - apic.drv: LAPIC enable + IOAPIC重定向表编程(MADT ISO感知) + apic_route/apic_route_legacy/apic_diag开关 - UTSM: LAPIC EOI钩子(register_apic_eoi, ABI尾部追加) + IDT 0-255全覆盖 + spurious 0xFF特判 - FUCK: apic_route=0默认PIC(零回归) / =1 IOAPIC->LAPIC接管(失败完整降级) / legacy放开IRQ1/12/11 存储: - nvme.drv: 写路径 + PRP list + 读回校验 + MSI/MSI-X中断驱动(nvme_msi开关, 回退纯轮询) - build.ps1: apic.drv纳入构建(原为预置二进制) 网络: - virtio_net: virtqueue RX/TX + netdev注册 + DHCP自测(slirp真实OFFER) PE兼容层: - pe_shim: guest->host指针转换(g_emu_mem_base + gp()) + shim fn32列补齐 - gen_pe.py: PE32+ RVA偏置修复(BUG-004) + cmd.exe生成 - desktop_app.h: da_mouse_poll先判AUX位 + da_mouse_init冲刷残留(BUG-003/008) - shell: Ctrl修饰键跟踪(BUG-001) + g_run_image扩至1MB(BUG-002) QEMU测试套件: - 9用例全自动化(Run-All.ps1): boot-regression/driver-matrix/linux-compat/pe-compat/deaicup-e2e/userapps-matrix/network-e2e/performance-baseline/x86emu32-coverage - QemuTest.ps1公共库: 串口断言/monitor sendkey/screendump/HTTP服务器/并发隔离 文档: - CLAUDE.md: APIC/IOAPIC能力 + kernel_api暴露 + IRQ后端升级状态 - LESSONS_LEARNED.md: B7 LAPIC/IOAPIC经验教训(2条) - Bug记录.txt: BUG-20260801-001~008 + BUG-20260803-009(9条) - test-cases/*.md: 全部补充自动化脚本小节 - 桌面设计.md: .lnk快捷方式 + LINUXAPP.CNF Linux应用图标 - 系统开发策划.md: NVMe/virtio_net标完成 + B2/B7标已解决 + M2进度列
172 lines
7.5 KiB
Markdown
172 lines
7.5 KiB
Markdown
# Deshab 桌面设计文档
|
||
|
||
> desktop.elf(Winux-Kate结构)的页面、应用、视觉、渲染与性能设计。事实以`CODE/desktop/main.c`与`CODE/UTSM/include/utsm/deshab_ui.h`为准。
|
||
|
||
---
|
||
|
||
## 1. 概述
|
||
|
||
`desktop.elf`是B4锚点加载的桌面管理器,全屏独占framebuffer,复刻Winux-Kate布局。直接轮询PS/2键盘/鼠标,通过boot context获取内核服务,EXIT返回DSK。
|
||
|
||
Kate之外的桌面特性:RTC+UP计时;VOL/BRIGHT可拖滑块(BRIGHT真实调暗);开机打字机Boot屏;FILES双击载入EDITOR(FAT32读写+SAVE);窗口单实例聚焦;Linux应用图标集成(LINUXAPP.CNF→兼容层委托执行)。
|
||
|
||
---
|
||
|
||
## 2. 整体布局
|
||
|
||
```text
|
||
app-shell
|
||
├── topbar (34px):品牌+工作区切换+页面切换+PG时钟
|
||
├── page-host
|
||
│ ├── 1·DASHBOARD:TERM-01/TERM-02/EDITOR/FILES四面板+StatusBar(32px)
|
||
│ ├── 2·IDE:标签栏+编辑宿主
|
||
│ ├── 3·DESKTOP:图标网格+窗口+任务栏
|
||
│ └── 4+/CUSTOM:外部.elf全屏宿主(≤4页,可增删)
|
||
└── task-view overlay(工作区卡片)
|
||
```
|
||
|
||
布局常量:KATE_TOPBAR_H=34, KATE_STATUSBAR_H=32, KATE_PAGE_PAD=8, 图标104×90, 网格gap=18, pad=24。
|
||
|
||
---
|
||
|
||
## 3. 页面系统
|
||
|
||
| 页 | 名称 | 内容 |
|
||
|----|------|------|
|
||
| 1 | DASHBOARD | 四面板(TERM-01+TERM-02+EDITOR+FILES)+StatusBar(时钟/UP/VOL/BRIGHT) |
|
||
| 2 | IDE | 标签栏+编辑宿主,多标签+新建 |
|
||
| 3 | DESKTOP | 图标网格+浮动窗口+任务栏 |
|
||
| 4+ | CUSTOM | 外部.elf全屏宿主,MAX_CPAGES=4 |
|
||
|
||
- 工作区MAX_WS=6,记录离开时页面;窗口MAX_WINDOWS=8,支持拖拽/聚焦/最小化/关闭
|
||
- RTC秒tick仅在DASHBOARD页且非任务视图时触发状态栏重绘
|
||
|
||
---
|
||
|
||
## 4. 应用机制(app_descriptor)
|
||
|
||
所有应用以`app_descriptor`注册(MAX_APPS=16 = 6内置+≤8 Linux应用+余量):
|
||
|
||
```c
|
||
typedef struct {
|
||
const char *name, *display_name;
|
||
u32 default_w, default_h;
|
||
app_create_fn on_create; // 内置应用
|
||
app_event_fn on_event;
|
||
app_draw_fn on_draw;
|
||
app_destroy_fn on_destroy;
|
||
const char *elf_name; // 外部ELF全屏宿主(8.3名)
|
||
const char *linux_cmd; // Linux兼容层命令
|
||
} app_descriptor;
|
||
```
|
||
|
||
`elf_name`与`linux_cmd`互斥(elf_name优先);仅设linux_cmd时须提供on_create(内置终端窗口承载)。
|
||
|
||
内置应用:shell(SHELL.ELF)、cmd(CMD.ELF)、editor(内置)、fileman(FILEMAN.ELF)、calc(内置)、browser(BROWSER.ELF)。
|
||
|
||
单实例策略:固定地址ADDR_TERM1=0x4000000/ADDR_TERM2=0x4100000/ADDR_TERMWIN=0x4200000/ADDR_EDDASH=0x5000000/ADDR_EDWIN=0x5100000/ADDR_CALC=0x6000000。
|
||
|
||
独立工具应用共享`CODE/tools/desktop_app.h`:dsk_entry入口+da_app_context(fb+block read/write+kernel_api),block API从kernel_api+0xA8取(read@+0x10,write@+0x18)。
|
||
|
||
---
|
||
|
||
## 5. 视觉系统
|
||
|
||
### 5.1 "Sealed Arc"设计语言
|
||
|
||
三隐喻:Arc(弧)——圆角/弧形边框;Seal(封)——卡片容器/发光边缘;Flow(流)——渐变/平滑过渡。
|
||
|
||
### 5.2 设计令牌
|
||
|
||
| 层 | 内容 |
|
||
|----|------|
|
||
| L0 原始色板 | Abyss Blue(900–100九级)/Seal Cyan(主操作)/Arc Violet(次级)/Neutral 0–900/语义色/渐变三色 |
|
||
| L1 语义色值 | 暗色主题(Shell: BG=DP_ABYSS_900, 主文字=DP_NEUTRAL_700, 强调=DP_SEAL_500);亮色(FirstInit/DSK) |
|
||
| L2 组件令牌 | 圆角/高度/内边距/边框,引用L1 |
|
||
|
||
约定:色值0xAARRGGBB;**所有UI组件必须经deshab_ui.h取参数,禁止硬编码**。
|
||
|
||
### 5.3 落地决策
|
||
|
||
- DU_RADIUS_MD/LG改为0(直角),仅小按钮4px/模态框16px/药丸全圆角
|
||
- 简化面板渲染/窗口光晕/不必要渐变;hover提亮,active反转色
|
||
|
||
---
|
||
|
||
## 6. 渲染架构
|
||
|
||
### 6.1 双缓冲
|
||
|
||
渲染到sprite buffer(SPRITE_BUF_ADDR=0x7000000, 112MB, identity-mapped),完成后flip到真实framebuffer。flip_buffer()全屏拷贝;flip_rect(x,y,w,h)仅拷贝指定矩形。
|
||
|
||
### 6.2 脏矩形
|
||
|
||
MAX_DIRTY_RECTS=16,mark_dirty记录变化区域,溢出降级全屏重绘。每帧合并为包围盒→redraw_all+flip_rect(合并区域)。终端面板有行级脏标记(dirty_rows+any_dirty)。
|
||
|
||
### 6.3 光标
|
||
|
||
软光标24×24,移动时save/restore背景+两次局部flip_rect(旧位置+新位置)。动画延时期间持续轮询鼠标。
|
||
|
||
### 6.4 主循环
|
||
|
||
```text
|
||
轮询PS/2鼠标→滑块拖拽→排空键盘缓冲→handle_key→RTC tick→
|
||
need_redraw? 全屏重绘+flip / 脏矩形→redraw_all+flip_rect(包围盒)
|
||
moved? 光标save/restore+局部flip
|
||
```
|
||
|
||
---
|
||
|
||
## 7. FILES面板与FAT32集成
|
||
|
||
- 经f32_list_root枚举FAT32根目录(MAX_FILES=24)
|
||
- 过滤:跳过子目录、.ELF可执行、FIRSTINI*(系统模块)
|
||
- 显示名↔8.3内部名双向转换
|
||
- 双击:f32_read_root_file读入EDITOR(过滤不可打印字符,保留\n/\t),聚焦EDITOR;SAVE经FAT32写路径回写
|
||
- 无块设备时降级为空态
|
||
|
||
---
|
||
|
||
## 8. 桌面图标来源(.lnk快捷方式 + LINUXAPP.CNF Linux应用)
|
||
|
||
### 8.1 .lnk快捷方式
|
||
|
||
`setup_desktop_icons()`先上架4个用户快捷方式(编辑器/文件管理/浏览器/终端),`shortcuts_refresh()`当前为硬编码列表(SYSTEM/user/desktop/*.lnk已随镜像分发,解析留待后续);快捷方式图标`app_id=-1`,双击经`launch_external_elf()`加载对应工具ELF全屏宿主。
|
||
|
||
### 8.2 LINUXAPP.CNF Linux应用
|
||
|
||
快捷方式之后追加Linux应用图标。**无论Linux兼容层服务是否可用都注册**:桌面启动时读FAT32根目录LINUXAPP.CNF(8.3名LINUXAPPCNF),每行一条:`显示名|linux命令`。规则:空行/#注释忽略;显示名≤11字符(DA_LINUXAPP_NAME_CAP=12),命令≤63字符(DA_LINUXAPP_CMD_CAP=64);按空格分词(首token为程序路径,绝对路径直接用,裸命令补/bin/前缀);DA_LINUXAPP_MAX=8。CNF缺失/无有效行时回退内置默认3条(HELLO=/bin/echo、UNAME=/bin/uname -a、LS=/bin/ls -l /,均为Arch rootfs与initramfs busybox共有命令)。
|
||
|
||
- 图标:`draw_icon_linux`暗底终端+霓虹绿`>_`;服务不可用(VMX缺失/guest未驻留)时改用KS_TEXT_DIM置灰(`g_lnx_svc_up=0`)
|
||
- 双击:内置终端窗口承载(720×480,标题`NAME . Linux`)→回显`$ <cmd>`→`lnx_on_create`运行时复查服务:
|
||
- 可用:`linux_compat_service.exec()`同步委托执行(UI冻结),输出经ANSI CSI剥离/`^M`忽略/`\t`展开一次性追加,`[exit N]`按退出码绿/琥珀
|
||
- 不可用:红色提示`linux: compat service unavailable`+`[exit -1]`,绝不panic
|
||
- 串口打点:`linux apps: loaded LINUXAPP.CNF`/`builtin defaults`/`service unavailable (icons greyed)`、`linux app registered: <名>`、`linux exec`、`app launched`
|
||
|
||
---
|
||
|
||
## 9. 输入系统
|
||
|
||
- 事件模型:EV_MOUSE_MOVE/DOWN/UP, EV_KEY_DOWN/UP(坐标/按键/scancode/修饰态)
|
||
- 鼠标:PS/2轮询3字节包(g_mouse_buf),按下/释放边沿标志
|
||
- 键盘:排空0x60缓冲,处理0xE0前缀+修饰键
|
||
- 双击:g_last_click_tsc+位置阈值(TSC计时)
|
||
- 交互控件:窗口拖拽、任务栏项、VOL/BRIGHT滑块(slider_set拖拽)、亮度延迟应用
|
||
|
||
---
|
||
|
||
## 10. 性能设计
|
||
|
||
| 瓶颈 | 对策 | 状态 |
|
||
|------|------|------|
|
||
| 全屏flip拷贝 | 双缓冲+脏矩形合并,仅flip包围盒 | ✅ |
|
||
| 圆角/渐变栅格化 | DU_RADIUS_MD/LG改直角、简化光晕 | ✅ |
|
||
| 亮度调整 | 延迟应用(g_bright_applied) | ✅ |
|
||
| 终端/编辑器重绘 | 行级脏标记增量渲染 | ✅ |
|
||
| redraw_all全屏绘制 | 真正局部重绘 | 🔶 |
|
||
| memcpy效率 | SIMD/ERMS加速 | 🔶(需SSE启用) |
|
||
|
||
---
|
||
|
||
> 相关文档:[ARCHITECTURE.md](ARCHITECTURE.md)、[BOOT_SEQUENCE.md](BOOT_SEQUENCE.md)、[兼容层设计.md](兼容层设计.md)
|