CONFIG_CMDLINE_OVERRIDE 设置了但是硬编码的 vga-boot-parameter 被忽略了?

CONFIG_CMDLINE_OVERRIDE 设置了但是硬编码的 vga-boot-parameter 被忽略了?

我已经构建了一个自定义的 Linux 内核,其选项如下:

...
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE_OVERRIDE=y
CONFIG_CMDLINE="initrd=linux_os.gz root=/dev/ram0 init=/sbin/init ramdisk_size=25600 consoleblank=0 loglevel=2 console=ttyS1 vga=785"
...

我使用 syslinux 作为引导加载程序。使用以下配置(与硬编码的参数相同)可以正常工作:

default MyConfig
prompt 0
label MyConfig
kernel vmlinuz
append initrd=linux_os.gz root=/dev/ram0 init=/sbin/init ramdisk_size=25600 consoleblank=0 loglevel=5 console=ttyS1 vga=785

但如果我将最后一行替换为:

append initrd=linux_os.gz root=/dev/ram0 init=/sbin/init ramdisk_size=25600

它“无法”启动(vga 模式没有按预期改变)。使用CONFIG_CMDLINE_OVERRIDE=y引导加载程序中配置的参数应该被忽略还是我错了?

我在 x86 上使用 vanilla 3.10.10-Kernel,没有相关补丁(只是替换了启动徽标)。这是一块嵌入式硬件,我无法配置启动参数,只能替换vmlinuzlinux_os.gz进行测试。

答案1

深入研究内核源并找到了我的答案:视频模式在 x86 上设置得很早 - 甚至在切换到保护模式之前(set_video()在(arch/x86/boot/main.c)中)。稍后在(arch/x86/kernel/setup.c)中完成main()评估。我没有真正的解决办法,但至少有一个解决方法:CONFIG_CMDLINE_OVERRIDEsetup_arch()

在 ./arch/x86/boot/video.c 中,替换

for (;;) {
    if (mode == ASK_VGA)
        mode = mode_menu();

    if (!set_mode(mode))
        break;

    printf("Undefined video mode number: %x\n", mode);
    mode = ASK_VGA;
}
boot_params.hdr.vid_mode = mode;

boot_params.hdr.vid_mode = 785;
set_mode(785);

(或您想要的任何其他视频模式)。这可能会破坏模式更改,但我不想更改模式;)

相关内容