2

Я собрал собственное ядро 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 параметры, настроенные в загрузчике, должны игнорироваться или я ошибаюсь в этом?

Я использую ядро vanilla 3.10.10 без соответствующих патчей (просто заменяя загрузочный логотип) на x86. Это часть встроенного оборудования, и я не могу настроить параметры загрузки, просто заменив vmlinuz и linux_os.gz за исключением тестирования.

1 ответ1

2

Покопался в ядре ядра и нашел мой ответ: режим видео установлен на x86 очень рано - даже до перехода в защищенный режим (set_video() в main() (arch/x86/boot/main.c). Оценка CONFIG_CMDLINE_OVERRIDE выполняется позже в setup_arch() (arch/x86/kernel/setup.c). У меня нет реального решения, но, по крайней мере, обходной путь:

в ./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);

(или любой другой режим видео вы хотите). Это может нарушить изменение режима, но я не хочу менять режимы;)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .