Рейтинг:0

Ubuntu явно не использует printf для вывода при загрузке? Может это?

флаг ng

Этот вопрос возникает у меня, когда я пытаюсь заставить гостевую ОС Ubuntu отображать загрузочные сообщения в виртуальной машине QEMU (например, [ 2.34567890123] ... и [ OK ] ....). Здесь у меня есть виртуальная машина QEMU, и хост, и гость — Ubuntu 20.04. Чтобы отобразить загрузочные сообщения гостя в консоли хоста (т. е. в командной строке, которая запускает qemu), я установил несколько строк гостевого /etc/по умолчанию/жратва файл следующим образом:

GRUB_TIMEOUT_STYLE=меню
GRUB_TIMEOUT=5
GRUB_TERMINAL_OUTPUT=консоль
GRUB_CMDLINE_LINUX_DEFAULT=номодесет

Затем я запускаю гостя с помощью следующей команды:

qemu-system-x86_64 -hda ubuntu.qcow -m 2000 -nographic -serial нет

GRUB выводит свой TUI либо в последовательном, либо в текстовом режиме VGA. -нографический отключает выход VGA и -серийный нет отключает последовательную консоль, поэтому я не вижу GRUB TUI. В консоли отображается только монитор QEMU. Согласно документации г. -нографический (здесь), «QEMU — это простое приложение командной строки» в этой ситуации. Как и обычная программа C/C++, монитор QEMU использует printf (или другую функцию, но, пожалуйста, позвольте мне использовать это имя в качестве целесообразного) для отображения ее версий, подсказок и других сообщений. Через 5 секунд загружается гостевая ОС Ubuntu.Однако я не вижу никаких загрузочных сообщений, напечатанных в консоли. Мои предыдущие эксперименты показывают, что Ubuntu не использует последовательную консоль, вместо этого он использует текстовый режим VGA для вывода. По этой причине я предполагаю, что если Ubuntu может использовать тот же printf для вывода своих загрузочных сообщений, QEMU должен иметь возможность отображать их в консоли (мультиплексировано с монитором QEMU), точно так же, как обрабатываются выходные данные монитора QEMU. Основываясь на наблюдении, что консоль имеет только вывод монитора QEMU, мой вопрос:

Убунту не использует printf для вывода при загрузке, явно или по умолчанию, возможно, из-за соображений производительности? Если это поведение по умолчанию, какой вариант загрузки я могу использовать, чтобы заставить Ubuntu использовать printf для вывода его загрузочного сообщения (или любого метода вывода, который использует монитор QEMU), в отличие от текстового режима VGA? В качестве примечания: я гуглил, но не нашел онлайн-документации по параметрам загрузки Ubuntu, например номодесет, поэтому я не знаю, есть ли какой-либо параметр загрузки Ubuntu, который может указать это. Пожалуйста, поделитесь со мной ссылкой на него, если вы его знаете. Это большая работа, поэтому я не могу сказать наверняка, что упомянул все выше. Если я пропустил упоминание чего-то в вопросе, сообщите мне, и я отредактирую. Спасибо.

Sadaharu Wakisaka avatar
флаг pl
Добро пожаловать в AskUbuntu, «echo» — это обычная команда для печати чего-либо на дисплее, «printf» изначально является командой для принтера и должна быть включена оболочкой. Я думаю, что у `bash` он есть, а у `sh` Bourne Shell нет.
muru avatar
флаг us
Некоторые из сообщений, о которых вы говорите, на самом деле будут напечатаны ядром, и обычно в ядре используется [`printk`](https://en.wikipedia.org/wiki/Printk). GRUB появился даже раньше ядра, кто знает, что он использует для отображения текста? В конце концов, программы, использующие «printf», обычно полагаются на что-то еще для фактического рендеринга вывода, а в случае с GRUB и ядром ничего другого нет.
muru avatar
флаг us
Я думаю, что вместо этой довольно запутанной [проблемы XY] (https://meta.stackexchange.com/q/66377/270345) вам следует просто спросить, как добиться того, чего вы хотите, что выглядит так: «Как мне сделать QEMU показывает вывод консоли гостевой ВМ в терминал?"
флаг in
Не существует такой вещи, как `printf`, которую ядро ​​может просто вызвать. Ядро отвечает за перенаправление этих printf туда, куда они должны идти, будь то VGA, последовательный порт или куда-то еще. Таким образом, нет никакого способа, чтобы `printf` в вашем госте мог волшебным образом появиться на хосте, если только ваш гость не отправит эти сообщения туда, где ваш хост их увидит.
Рейтинг:0
флаг ng

После двухдневного расследования я думаю, что наконец нашел ключ к вопросу.

printf отправляет выходные данные как в текстовом режиме VGA (копирование в буфер памяти для текстового режима), так и в последовательный порт. Доказательства xv6 используется во многих курсах ОС. кему-нокс цель в xv6Makefile указывает -нографический. Если мы добавим -серийный нет, xv6 будет отображать только монитор QEMU (кему).

И GRUB, и оболочка ubuntu (под оболочкой я имею в виду, что загрузка завершена) используют printf функция. Однако разница в том, что GRUB использует последовательный порт, а Ubuntu по умолчанию отключает его. Вот почему под -нографический, GRUB может показать, но оболочка ubuntu не может. Это также объясняет, почему -проклятия может отображать оба из них.

Монитор QEMU использует нормальный printf тоже. Однако он работает на хосте, на котором уже включен последовательный порт, поэтому он может выводить на консоль хоста. Гостевая Ubuntu отключает серийный номер в образе iso, поэтому он ничего не печатает под -нографический.

Фаза загрузки Ubuntu использует только текстовый режим VGA. Нет серийного номера, даже если он включен. Таким образом, сообщения загрузки (а также завершения работы) не могут отображаться под -нографический но может отображаться под -проклятия. Я думаю, это связано с соображениями производительности, потому что память для прямой записи (буфер текстового режима) быстрее, чем printf который вдобавок выполняет последовательные операции.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.