这里的“VGA 参数”可以从两个层面来理解:

- 内核启动时通过命令行传递的参数:这些参数告诉内核如何初始化和控制显卡(通常是早期的 VGA 兼容显卡)以及相关的帧缓冲设备。
- 内核内部用于驱动和控制 VGA 硬件的代码和数据结构:这部分是内核开发者更关心的。
下面我将从这两个层面进行详细说明。
内核启动参数
这些参数通常在引导加载程序(如 GRUB)的配置文件中指定,用于在内核启动的早期阶段配置显示功能,它们对于系统启动过程、早期的调试以及在没有现代图形驱动(如 KMS)的系统上至关重要。
vga= 参数
这是最经典、最核心的 VGA 参数,用于设置内核文本模式下的分辨率和颜色深度。
格式:
vga=模式号

模式号: 模式号是一个十六进制数字,它代表了特定的视频模式,这些模式定义了分辨率(如 80x25, 80x50, 80x43)和颜色深度(通常是 16 色)。
常见模式号列表:
| 模式号 | 分辨率 | 颜色 | 描述 |
|---|---|---|---|
0x03 |
80x25 | 16 | 标准 VGA 文本模式,最常用。 |
0x04 |
40x25 | 16 | 低分辨率文本模式。 |
0x05 |
40x25 | 16 | EGA 兼容模式。 |
0x06 |
80x25 | 16 | EGA 兼容模式。 |
0x07 |
80x25 | 16 | 单色 VGA 模式。 |
0x0F |
80x25 | 16 | EGA 640x350 80x25 文本模式。 |
0x10 |
80x25 | 16 | EGA 640x350 80x25 文本模式。 |
0x11 |
80x30 | 16 | VGA 640x480 80x30 文本模式。 |
0x12 |
80x43 | 16 | VGA 640x480 80x43 文本模式。 |
0x13 |
320x200 | 256 | 非常流行的 256 色图形模式,常用于早期游戏和启动画面。 |
0x50 |
80x30 | 16 | VGA 640x480 80x30 文本模式。 |
0x51 |
80x43 | 16 | VGA 640x480 80x43 文本模式。 |
0x52 |
80x60 | 16 | VGA 800x600 80x60 文本模式。 |
0x53 |
100x60 | 16 | VGA 800x600 100x60 文本模式。 |
0x54 |
132x25 | 16 | VGA 1024x768 132x25 文本模式。 |
0x55 |
132x43 | 16 | VGA 1024x768 132x43 文本模式。 |
0x56 |
132x50 | 16 | VGA 1024x768 132x50 文本模式。 |
0x57 |
132x60 | 16 | VGA 1024x768 132x60 文本模式。 |
0x59 |
80x30 | 16 | VGA 1024x768 80x30 文本模式。 |
0x5A |
80x34 | 16 | VGA 1024x768 80x34 文本模式。 |
0x5B |
80x43 | 16 | VGA 1024x768 80x43 文本模式。 |
0x5C |
80x60 | 16 | VGA 1024x768 80x60 文本模式。 |
0x5D |
132x25 | 16 | VGA 1280x1024 132x25 文本模式。 |
0x5E |
132x30 | 16 | VGA 1280x1024 132x30 文本模式。 |
0x5F |
132x43 | 16 | VGA 1280x1024 132x43 文本模式。 |
0x60 |
132x50 | 16 | VGA 1280x1024 132x50 文本模式。 |
0x61 |
132x60 | 16 | VGA 1280x1024 132x60 文本模式。 |
示例 (GRUB 配置):
在 /etc/default/grub 文件中,修改 GRUB_CMDLINE_LINUX_DEFAULT 行:
# 设置为 80x43 的文本模式 GRUB_CMDLINE_LINUX_DEFAULT="vga=0x12" # 或者设置为 256 色的 320x200 图形模式 # GRUB_CMDLINE_LINUX_DEFAULT="vga=0x13"
然后运行 sudo update-grub 使配置生效。

video= 参数
vga= 参数比较古老,主要用于设置文本模式,现代内核更推荐使用 video= 参数,因为它功能更强大,支持直接配置帧缓冲设备,这对于显示内核启动画面(splash)至关重要。
格式:
video=模式名
常见模式名:
-
vesa:<xres>x<yres>[-<bpp>][@<refresh>]:指定 VESA 模式。xres,yres: 分辨率。bpp: 每像素位数(颜色深度),可选。refresh: 刷新率,可选。- 示例:
video=vesa:1024x768-32@75(设置 1024x768 分辨率,32位色,75Hz 刷新率)
-
uvesafb:<xres>x<yres>[-<bpp>][@<refresh>][,<mode_option>]:使用uvesafb内核模块,支持更多 VESA 模式和选项。- 示例:
video=uvesafb:1024x768-32,mtrr:3,ywrap,redraw
- 示例:
-
fbcon=<driver>:<options>:直接指定帧缓冲控制台驱动。- 示例:
video=efifb:mode=1024x768(使用efifb驱动)
- 示例:
-
nomodeset:这是一个非常重要的参数,但它本身不设置模式,而是禁止内核使用模式设置。- 用途: 当显卡的开源驱动(如 nouveau, amdgpu)有问题时,可以强制内核使用 VGA 兼容的文本模式,避免系统在启动阶段崩溃,这通常意味着你无法获得图形界面或硬件加速,只能使用最基本的文本控制台。
示例 (GRUB 配置):
在 /etc/default/grub 中:
# 使用 uvesafb 设置 1024x768-32 位色,并启用 mtrr 和 ywrap GRUB_CMDLINE_LINUX_DEFAULT="video=uvesafb:1024x768-32,mtrr:3,ywrap" # 禁用 nouveau 驱动,强制使用 vga 文本模式 # GRUB_CMDLINE_LINUX_DEFAULT="nomodeset vga=0x317"
vga=0x317 是 vga= 参数中一个比较通用的值,通常代表 80x30, 256色的文本模式,适用于多种显示器。
内核内部 VGA 控制机制
当内核启动后,它通过一系列的数据结构和函数来与 VGA 硬件交互。
核心数据结构:struct screen_info
这是内核中存储 BIOS 传递过来的初始屏幕信息的最重要结构体,它定义在 include/uapi/linux/screen_info.h 中。
struct screen_info {
__u8 orig_x; /* 原始列数 */
__u8 orig_y; /* 原始行数 */
__u16 ext_memk; /* 扩展内存大小 (KB) */
__u16 orig_video_page; /* 原始视频页面 */
__u8 orig_video_mode; /* 原始视频模式 */
__u8 orig_video_cols; /* 原始列数 */
__u8 flags; /* 标志位 */
__u8 unused2; /* 保留 */
__u16 orig_video_ega_bx;/* EGA BIOS 信息 */
__u16 unused3;
__u8 orig_video_lines; /* 原始行数 */
__u8 orig_video_isVGA; /* 是否是 VGA */
__u16 orig_video_points; /* 字符点阵大小 */
/* VESA BIOS 信息 */
__u16 vesa_attributes;
__u32 vesa_fb_base; /* 帧缓冲区物理地址 */
__u16 vesa_fb_size; /* 帧缓冲区大小 (64KB 单位) */
/* 其他模式信息... */
...
};
工作流程:
- BIOS 传递: 当计算机启动时,BIOS 会进行 POST(加电自检),并设置显卡的初始状态。
- 内核读取: 内核的早期启动代码(在
arch/x86/boot目录下)会通过 INT 10h 中断调用 BIOS,获取这些信息,并填充到screen_info结构体中。 - 后续使用: 内核后续的初始化代码(特别是帧缓冲控制台
fbcon)会读取这个结构体,以了解当前的显示模式,并在此基础上进行操作或切换。
内核模块
-
fbcon(Frame Buffer Console): 这是内核中负责在帧缓冲设备上显示文本和图形的控制台驱动,当你在内核启动参数中设置了vga=或video=后,fbcon就会利用这些信息来初始化控制台,它不直接操作 VGA 寄存器,而是通过struct fb_info这个更通用的帧缓冲接口来与具体的硬件驱动(如efifb,vesafb,uvesafb或现代的amdgfb)通信。 -
vesafb: 一个简单的驱动,用于支持 VESA BIOS Extensions (VBE) 2.0+ 定义的图形模式,它通过 BIOS 调用来获取信息,功能有限。 -
uvesafb:vesafb的一个增强版,它允许用户在运行时通过sysfs接口动态地改变分辨率、颜色深度等,功能更强大。 -
efifb: 用于支持现代 UEFI 系统的帧缓冲,UEFI 自身已经提供了图形模式,efifb直接使用 UEFI 提供的帧缓冲区,而不是通过 BIOS/VESA。
VGA 遗留 I/O 端口
对于真正的 VGA 兼容显卡,内核可以通过一组特定的 I/O 端口来直接控制硬件,这些操作现在主要在非常底层的代码或某些特定场景(如早期启动)中使用。
- 索引/数据端口: VGA 寄存器通过两个端口访问:一个索引端口(写入寄存器号)和一个数据端口(写入或读取寄存器值)。
- 索引端口:
0x3C4,0x3CE等 - 数据端口:
0x3C5,0xCF等
- 索引端口:
- CRT 控制器: 控制水平/垂直同步、显示时序等,地址在
0x3B4-0x3B5。 - 图形/字符模式寄存器: 设置显示模式(文本/图形),地址在
0x3C4。 - 调色寄存器: 设置颜色(16 色模式下),地址在
0x3C8-0x3C9。
现代内核在正常使用时(通过 KMS 和现代驱动)不会直接操作这些端口,而是通过显卡的 MMIO 内存映射寄存器来控制。vga= 参数相关的操作也主要是在启动阶段通过 BIOS 完成的,内核本身不直接写这些端口。
总结与现代视角
| 特性 | vga= 参数 |
video= 参数 |
|---|---|---|
| 时代 | 古老,传统 BIOS 系统 | 现代,推荐用于 UEFI 和 BIOS |
| 功能 | 仅设置文本模式 | 设置文本/图形模式,控制帧缓冲 |
| 灵活性 | 低,仅支持预定义模式号 | 高,可指定分辨率、颜色、刷新率 |
| 用途 | 修复启动问题,基本控制台 | 启用 splash 启动画面,优化早期显示 |
| 内核接口 | 主要影响 screen_info,由 fbcon 使用 |
直接配置 fbdev (帧缓冲设备) |
现代 Linux 系统的图形栈:
- 启动阶段: 内核使用
video=或vga=参数初始化一个临时的帧缓冲(fbdev),用于显示启动日志和splash画面。 - 用户空间接管: 内核启动完成后,
systemd或init会启动用户空间的显示管理器(如 GDM, SDDM)和图形服务器(如 X.Org 或 Wayland)。 - 现代驱动接管: 图形服务器会加载显卡的现代驱动(如
nvidia,amdgpu,i915),这些驱动使用 KMS (Kernel Mode Setting)。 - KMS: KMS 是现代 Linux 图形的核心,它允许图形服务器在内核中直接设置显示模式(分辨率、刷新率),而不是像过去那样在用户空间设置,这提供了更好的稳定性和性能,KMS 驱动会取代
fbdev成为对显卡的直接控制者。
对于普通用户来说,vga= 和 video= 参数主要在系统启动时发挥作用,一旦进入图形界面,其控制权就交给了 KMS 驱动,但在解决启动问题、配置服务器或进行一些底层调试时,理解这些参数仍然非常有用。
