这可能是一个愚蠢而奇怪的问题,但我实在是睡不着觉,除非我找到答案。计算机如何知道如何在屏幕上显示文本和 GUI?如果我没记错的话,x86 计算机的启动过程如下:
- BIOS 启动 CPU 和其余硬件,并检查一切是否正常工作
- CPU 从启动分区的前 512? 字节开始执行代码,屏幕显示引导加载程序菜单
- 执行选定的内核
- ETC。
我的问题是:如果在内核启动之前没有操作系统,计算机如何知道如何在屏幕上显示文本?BIOS 和引导加载程序可以显示一些文本和基本 GUI。他们是如何做到这一点的?BIOS/引导加载程序是否告诉 CPU(GPU?)它必须在位置 (0,0) 上显示蓝色像素,然后在 (1,0) 上显示白色像素等?
我的第二个理论是 BIOS 有一个基本的显示器驱动程序,它有某种 API 可以在屏幕上打印。显示器驱动程序是否有某种 print() 函数可用?
据我所知,打印文本的汇编函数特定于每个操作系统,因此它不能直接通过 CPU 的指令集获得。
我的问题的第二部分是,KDE 或 GNOME 等桌面环境如何工作?假设我想为 Linux 创建一个全新的桌面环境。我从哪里开始?C/C++ 或任何其他高级语言中都没有函数来显示n 颜色prixel 在位置 (x,y)。显示桌面的程序是用什么语言编写的?它是逐像素创建桌面吗?GTK 或 Qt 等库如何工作?我知道我可以用几个函数显示一个窗口,但这些函数究竟是如何工作的?
如果我的问题不清楚,请见谅。英语不是我的母语。
答案1
基本上,主板上有一个 ROM(只读存储器)芯片,它告诉主板如何显示所需的 GUI。您认为主板上没有软件,但实际上它有软件,制造商已预装了软件。实际上,您更可能将其称为“固件”,因为它是硬连线到芯片的软件。
至于图形桌面环境,它们实际上没有什么特别之处。它们绘制到屏幕的方式与其他程序相同。绘制到屏幕真正需要做的就是知道负责处理图形的芯片(通常是 GPU 或 IGPU/APU)的地址。当普通程序执行此操作时,我相信它们会从操作系统请求此信息,因此如果您要编写自己的图形桌面环境,则必须确定将数据发送到哪个地址。您需要的地址应由您拥有的任何 G/IG/APU 的驱动程序提供。
答案2
主要分为两个部分:
MBR 加载后,其代码会加载第二阶段的启动代码,即 Windows 启动管理器或 Linux 上的 GRUB。此启动管理器/加载器在代码中实现了文本和图形功能,或使用直接 BIOS 访问进行文本输出。
使用任何编程语言(如 C、C++、Java、Basic)加载操作系统(Windows、Linux 等)后,您都可以访问内核和/或库中实现的函数,从而可以在屏幕上书写或绘图。如今,每种编程语言都有一些 IDE(集成开发环境),这大大简化了用户代码的编写。