我的意思是它是否使用 CPU 访问 MMIO 将像素放到显示器上,而无需其他硬件(例如 GPU 等)跟进。
当 Windows 98 启动时,它会通过启动的任何程序(Winload.exe?)加载图像,解码图像并将图像写入 MMIO 设备以显示。这不需要 GPU,但 Windows 98 有 GPU 的设备驱动程序。我认为它的工作原理如下:
WIN 加载程序 -> 图像解码 -> 调用显示驱动程序 -> 写入像素。
以下是两个问题:
1.当 Windows 98 启动并默认显示旗舰启动画面图像(或任何用户定义的图像)时,它是否让 CPU 对其进行解码并将其直接写入帧缓冲区/VGA/VESA 软件中间件(驱动程序)以将像素放在显示屏上并避免在已加载 GPU 驱动程序的情况下使用 GPU?
2.如果没有检测到 GPU 驱动程序,Windows 98 是否可以在没有任何 GPU 的情况下完全正常运行(操作系统本身)并且只让 CPU 写入帧缓冲区(不考虑像 OpenGL/DirectX/等的东西)?
简单来说,Windows 98 是否 100% 依靠 CPU 运行,不需要 GPU(除了游戏、视频解码等的 OpenGL/DirectX 高端图形处理/硬件加速绘制/等)?3D 游戏可能使用 GPU 通过 OpenGL/DirectX 进行快速图形加速,因此 CPU 不太可能做任何事情,除了为此写入 GPU。但操作系统的 shell/GUI 和基本功能似乎非常基础,缺乏任何加速,可能只是使用某种显示绘制低级软件进行像素操作,仅使用 CPU 进行绘制?
请注意,我说的是“GPU”,但我们可以认为它是指任何写入显示器的非 CPU 硬件。CPU 可以直接写入显示器而无需任何 GPU,但更进一步则需要 MMIO、低级编程、规范和电子/计算机工程。
答案1
了解一点历史将有助于您理解 Windows 9x 世界中事物是如何运作的。
自 Intel 80386 以来,处理器就有两种“操作模式”:实模式和保护模式。首次打开计算机时(即使是现代的 Core i7 游戏机),处理器也会以实模式启动。实模式不提供内存保护、不支持多任务、不提供代码特权级别——什么都没有。任何程序都可以直接、不受限制地访问内存。与硬件的通信由 BIOS 通过中断调用提供。
中断的作用正如其名称所暗示的那样;它使 CPU 停止运行。程序会将图像的位图加载到帧缓冲区中。然后,它会将指向该内存的指针放在 AX CPU 寄存器的低字节(称为 AL)中,并将 BIOS 指令显示在高字节(AH)中。然后,它会调用 BIOS 中断 0x10h,BIOS 将接管。此时,CPU 不再控制您的计算机。
然后 BIOS 会读取 AH 中的指令,并将 AL 中的指针传递给视频硬件。然后 GPU 会将帧缓冲区的内容复制到自己的 RAM 中,然后将控制权交还给 BIOS,BIOS 再将控制权交还给 CPU。现在 CPU 又回到了驾驶座上。
重要的是要记住,Windows 9x 系列的所有版本基本上都是 DOS 应用程序。因此,当 Win98 显示其启动画面时,CPU 仍处于实模式,并且仍在使用 BIOS 中断来显示它。底部可爱的小动画只是调色板循环技巧。那里没有发生任何绘图。
现在,当 Windows 加载时,它的首要任务之一就是将 CPU 切换到 32 位保护模式。这基本上将 DOS 从内存中踢出,并告诉 BIOS 它可以做什么。大多数原本由 BIOS 处理的功能现在都被 Windows HAL 和内核取代。在 Windows 世界中,应用程序通过 API 调用与硬件对话,并且该 API 调用通过显示驱动程序运行它,这是操作系统的必需组件。
现在(终于)我们要开始讨论您的问题了。当时,Windows 确实(直到今天仍然如此)通过显示驱动程序控制视频硬件。如果没有可用的驱动程序,它将默认使用标准 Windows 驱动程序,该驱动程序使用帧缓冲区进行绘制。唯一的区别是 CPU 始终通过内存映射 I/O 进行控制,并且 BIOS 不参与其中。如果存在驱动程序,该驱动程序仍将使用 MMIO,但会向 GPU 发出专有命令,而不是位图帧。GPU 可以直接访问内存,并且可以与 CPU 并行运行,包括通过这些 I/O 范围进行双向通信。
Windows 98 确实有当时的视频硬件驱动程序,并且可以提供全面的 2D 和 3D 加速,包括 OpenGL 和 DirectX。但它仍然需要一个驱动程序来将这些内容传达给 GPU,如果没有它,它就无法实现。
绘制窗口控件(即按钮、标题栏等)是通过 Windows 图形设备接口 (GDI) 完成的,它是用于绘制屏幕元素的主要 Windows API。它具有各种功能,包括形状、画笔、填充颜色,当然还有位图。GDI 会将这些指令转换为驱动程序代码。驱动程序(无论是 GPU 驱动程序还是帧缓冲区驱动程序)负责通过编程的方式将这些 GDI 指令发送到屏幕。
这需要消化很多内容,这只是对数据如何输入和像素如何输出的简要概述。我希望它能解答您的一些疑问。