You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GitHub中用TypeScript实现内核捕获OS错误时CLI显示BSOD消息

实现CLI下的蓝屏死机(BSOD)错误提示

要在CLI中实现类似Windows BSOD的效果,核心是清空屏幕、设置统一的蓝底白字样式、居中显示错误信息,具体实现分两种场景:


场景1:基于终端模拟器的CLI(用户态/虚拟机内核)

终端支持ANSI转义序列时,直接用控制码修改屏幕样式:

修改后的krnTrapError函数

public krnTrapError(msg) {
    Control.hostLog("OS ERROR - TRAP: " + msg);
    
    // ANSI控制序列:清空屏幕并将光标移至左上角
    const clearScreen = "\x1B[2J\x1B[H";
    // 设置背景为深蓝色(ANSI 256色码18),前景为纯白色
    const setBlueBg = "\x1B[48;5;18m\x1B[38;5;255m";

    // 构造格式化的错误消息
    const bsodContent = `
=============================================
               STOP: OS FATAL ERROR
=============================================
错误信息: ${msg}

系统无法继续运行,即将关闭。
=============================================
    `;

    // 输出控制码与错误内容
    _StdOut.putText(clearScreen + setBlueBg + bsodContent);
    
    this.krnShutdown();
}

代码说明

  • \x1B[2J:清空整个屏幕缓冲区
  • \x1B[H:将光标重置到屏幕左上角(1,1)位置
  • \x1B[48;5;18m:设置终端背景为深蓝色(可调整色码:19=更深的蓝,4=标准蓝)
  • \x1B[38;5;255m:设置前景为纯白色,保证文字在蓝底上清晰可见

场景2:裸机内核(VGA文本模式)

如果是直接操作硬件的裸机内核,需要直接写入VGA视频内存来实现蓝底效果:

修改后的krnTrapError函数

public krnTrapError(msg) {
    Control.hostLog("OS ERROR - TRAP: " + msg);
    
    // VGA文本模式视频内存起始地址(0xB8000)
    const videoMemory = new Uint16Array(0xB8000);
    // 属性位:背景蓝(0x10) + 前景白(0x0F) = 0x1F
    const blueWhiteAttr = 0x1F;
    const screenSize = 80 * 25; // 标准VGA文本模式尺寸:80列×25行

    // 填充整个屏幕为蓝底白字的空格
    for (let i = 0; i < screenSize; i++) {
        videoMemory[i] = (blueWhiteAttr << 8) | 0x20; // 0x20是空格ASCII码
    }

    // 构造要显示的错误行
    const errorLines = [
        "=============================================",
        "               STOP: OS FATAL ERROR",
        "=============================================",
        `错误信息: ${msg}`,
        "",
        "系统无法继续运行,即将关闭。",
        "============================================="
    ];

    // 计算居中偏移量,从第8行开始显示
    const startRow = 8;
    const colOffset = Math.floor((80 - errorLines[0].length) / 2);

    // 将每行写入视频内存
    errorLines.forEach((line, idx) => {
        const row = startRow + idx;
        const startPos = row * 80 + colOffset;
        for (let i = 0; i < line.length; i++) {
            videoMemory[startPos + i] = (blueWhiteAttr << 8) | line.charCodeAt(i);
        }
    });
    
    this.krnShutdown();
}

代码说明

  • VGA文本模式下,每个屏幕字符占2字节:高8位是属性(背景+前景色),低8位是ASCII码
  • blueWhiteAttr = 0x1F:直接设置背景为蓝色,前景为白色
  • 通过循环填充整个屏幕,再居中写入错误消息,模拟BSOD的视觉效果

内容的提问来源于stack exchange,提问作者Liam Knipper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 08:26:26