直接操作显存需操作系统与硬件双重授权,用户态程序默认无权访问;可行路径仅有编写内核驱动映射显存或通过DirectX/Vulkan等API间接操作。

直接操作显存需要操作系统和硬件双重授权
现代操作系统(Windows、Linux、macOS)默认禁止用户态程序直接读写显存,这是安全机制决定的——ptr = (uint8_t*)0xA0000 这类实模式下的段地址硬编码在保护模式下会触发页错误或段违例。你看到的“黑屏”“程序崩溃”或“拒绝访问”,大概率不是代码写错了,而是根本没获得访问权限。
Windows 下用 WriteProcessMemory 无法写显存
有人误以为用 WriteProcessMemory 向显卡驱动映射的内存地址写数据就能刷屏,这是错的。该函数只能写入**当前进程的用户空间内存**,而显存(尤其是帧缓冲区)通常位于内核空间或 GPU 专用物理地址,且受 IOMMU/VT-d 隔离。尝试对 0xB8000(VGA 文本模式旧地址)或 0xC0000000(某些集成显卡映射)写入,结果只会是 ERROR_ACCESS_DENIED 或 STATUS_ACCESS_VIOLATION。
可行路径只有两条:驱动层 or API 层
真要控制像素输出,必须绕过用户态直写这条路:
- 写一个内核模式驱动(如 Windows WDM / Linux kernel module),用
mmap或MmMapIoSpace映射显存物理地址,再同步刷新;但这要求签名认证、调试困难,且每次系统更新都可能失效 - 走标准图形 API:用
DirectX(Windows)、Vulkan或OpenGL创建可写纹理,通过Map/Unmap或glMapBuffer获取 CPU 可写指针——这个“指针”实际指向的是驱动管理的暂存内存,最终由 GPU 自动提交到显存 - 极少数嵌入式场景(如树莓派裸机、STM32+LCD 控制器)允许
mmap("/dev/fb0")后直接写,但需确认CONFIG_FB已启用且无 KMS 覆盖
别碰 int 10h 和实模式汇编
用内联汇编调 int 10h 设置 VGA 模式,在现代 x64 系统上根本不会执行:CPU 处于 64 位长模式,不支持实模式中断。哪怕强制切到兼容子模式,BIOS 中断服务也早被 UEFI 固件弃用。试图用 _asm { mov ax, 0x13; int 0x10 } 编译能过,运行必崩,错误通常是 EXCEPTION_ILLEGAL_INSTRUCTION。
立即学习“C++免费学习笔记(深入)”;
显存不是普通内存,它的地址、生命周期、一致性协议全由 GPU 和驱动联合管理。所谓“指针操作”,本质是和驱动协商访问权——跳过这层,剩下的全是未定义行为。


















