我已经构建了一个自定义的 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,没有相关补丁(只是替换了启动徽标)。这是一块嵌入式硬件,我无法配置启动参数,只能替换vmlinuz
并linux_os.gz
进行测试。
答案1
深入研究内核源并找到了我的答案:视频模式在 x86 上设置得很早 - 甚至在切换到保护模式之前(set_video()
在(arch/x86/boot/main.c)中)。稍后在(arch/x86/kernel/setup.c)中完成main()
评估。我没有真正的解决办法,但至少有一个解决方法:CONFIG_CMDLINE_OVERRIDE
setup_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);
(或您想要的任何其他视频模式)。这可能会破坏模式更改,但我不想更改模式;)