linux 内核 vga 参数

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 参数 正文

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

linux 内核 vga 参数
(图片来源网络,侵删)
  1. 内核启动时通过命令行传递的参数:这些参数告诉内核如何初始化和控制显卡(通常是早期的 VGA 兼容显卡)以及相关的帧缓冲设备。
  2. 内核内部用于驱动和控制 VGA 硬件的代码和数据结构:这部分是内核开发者更关心的。

下面我将从这两个层面进行详细说明。


内核启动参数

这些参数通常在引导加载程序(如 GRUB)的配置文件中指定,用于在内核启动的早期阶段配置显示功能,它们对于系统启动过程、早期的调试以及在没有现代图形驱动(如 KMS)的系统上至关重要。

vga= 参数

这是最经典、最核心的 VGA 参数,用于设置内核文本模式下的分辨率和颜色深度。

格式: vga=模式号

linux 内核 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 使配置生效。

linux 内核 vga 参数
(图片来源网络,侵删)

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=0x317vga= 参数中一个比较通用的值,通常代表 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 单位) */
    /* 其他模式信息... */
    ...
};

工作流程:

  1. BIOS 传递: 当计算机启动时,BIOS 会进行 POST(加电自检),并设置显卡的初始状态。
  2. 内核读取: 内核的早期启动代码(在 arch/x86/boot 目录下)会通过 INT 10h 中断调用 BIOS,获取这些信息,并填充到 screen_info 结构体中。
  3. 后续使用: 内核后续的初始化代码(特别是帧缓冲控制台 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 系统的图形栈:

  1. 启动阶段: 内核使用 video=vga= 参数初始化一个临时的帧缓冲(fbdev),用于显示启动日志和 splash 画面。
  2. 用户空间接管: 内核启动完成后,systemdinit 会启动用户空间的显示管理器(如 GDM, SDDM)和图形服务器(如 X.Org 或 Wayland)。
  3. 现代驱动接管: 图形服务器会加载显卡的现代驱动(如 nvidia, amdgpu, i915),这些驱动使用 KMS (Kernel Mode Setting)
  4. KMS: KMS 是现代 Linux 图形的核心,它允许图形服务器在内核中直接设置显示模式(分辨率、刷新率),而不是像过去那样在用户空间设置,这提供了更好的稳定性和性能,KMS 驱动会取代 fbdev 成为对显卡的直接控制者。

对于普通用户来说,vga=video= 参数主要在系统启动时发挥作用,一旦进入图形界面,其控制权就交给了 KMS 驱动,但在解决启动问题、配置服务器或进行一些底层调试时,理解这些参数仍然非常有用。

-- 展开阅读全文 --
头像
华为Mate Pro 128参数值多少?
« 上一篇 今天
智能办公室网络布局如何优化效率与安全?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]