在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
相关产品推荐
相关产品推荐

