Puncte:0

Ubuntu nu folosește în mod expres printf pentru ieșire la pornire? Se poate?

drapel ng

Această întrebare îmi apare când încerc să fac ca sistemul de operare Ubuntu invitat să afișeze mesaje de boot în QEMU VM (cum ar fi [ 2.34567890123] ... și [ OK ] ....). Aici am o VM QEMU, atât gazda, cât și invitatul fiind Ubuntu 20.04. Pentru a afișa mesajele de pornire ale oaspeților în consola gazdei (adică, linia de comandă care pornește qemu), am setat câteva linii din /etc/default/grub fișier după cum urmează:

GRUB_TIMEOUT_STYLE=meniu
GRUB_TIMEOUT=5
GRUB_TERMINAL_OUTPUT=consola
GRUB_CMDLINE_LINUX_DEFAULT=nomodeset

Apoi pornesc invitatul folosind următoarea comandă:

qemu-system-x86_64 -hda ubuntu.qcow -m 2000 -nographic -serial niciunul

GRUB își scoate TUI fie prin modul serial, fie prin modul text VGA. -nografic dezactivează ieșirea VGA și -serial nici unul dezactivează consola serială, așa că nu pot vedea niciun TUI GRUB. Doar monitorul QEMU este afișat în consolă. Conform documentaţiei a -nografic (Aici), „QEMU este o aplicație simplă de linie de comandă” în această situație. La fel ca programul normal C/C++, monitorul QEMU folosește printf (sau altă funcție, dar vă rog să-mi permiteți să folosesc acest nume ca un expedient) pentru a afișa versiunile sale, solicitările și alte mesaje. După 5 secunde, sistemul de operare invitat Ubuntu pornește.Cu toate acestea, nu pot vedea niciun mesaj de boot tipărit în consolă. Experimentele mele anterioare arată că Ubuntu nu folosește consola serială, ci folosește modul text VGA pentru ieșire. Din acest motiv, bănuiesc, dacă Ubuntu poate folosi același lucru printf pentru a-și scoate mesajele de pornire, QEMU ar trebui să le poată afișa în consolă (multiplicat cu monitorul QEMU), la fel cum sunt tratate ieșirile monitorului QEMU. Pe baza observației că consola are doar ieșirea monitorului QEMU, întrebarea mea este:

Ubuntu nu folosește printf pentru ieșire la pornire, în mod expres sau implicit, poate din cauza performanței? Dacă este un comportament implicit, ce opțiune de pornire pot folosi pentru a forța utilizarea Ubuntu printf pentru a-și scoate mesajul de pornire (sau orice metodă de ieșire pe care o folosește monitorul QEMU), spre deosebire de modul text VGA? Ca o notă secundară, am căutat pe google, dar nu am găsit nicio documentație online despre opțiunile de pornire Ubuntu, cum ar fi nomodeset, așa că nu știu dacă există vreo opțiune de pornire Ubuntu care poate specifica acest lucru. Vă rog să-mi împărtășiți linkul dacă îl cunoașteți. Este multă muncă, așa că nu pot spune sigur că am menționat totul mai sus. Dacă am omis să menționez ceva în întrebare, anunțați-mă și voi edita. Mulțumiri.

Sadaharu Wakisaka avatar
drapel pl
Bine ați venit la AskUbuntu, `echo` este o comandă normală pentru a imprima ceva pe afișaj, `printf` este inițial o comandă pentru o imprimantă și trebuie să fie inclusă în funcție de un shell. Cred că `bash` îl are și `sh` Bourne Shell nu.
muru avatar
drapel us
Unele dintre mesajele despre care vorbiți vor fi de fapt tipărite de kernel și, de obicei, se utilizează [`printk`](https://en.wikipedia.org/wiki/Printk) în kernel. GRUB vine chiar înaintea nucleului, cine știe ce folosește pentru a afișa text? La urma urmei, programele care folosesc „`printf`” se bazează de obicei pe altceva pentru a face redarea reală a ieșirii, iar în cazul GRUB și a nucleului, nu există altceva.
muru avatar
drapel us
Cred că în loc de această [problema XY] destul de complicată (https://meta.stackexchange.com/q/66377/270345), ar trebui să întrebați cum să obțineți ceea ce doriți, care pare să fie: „Cum fac QEMU arată ieșirea consolei unui VM invitat într-un terminal?"
drapel in
Nu există un „printf” pe care nucleul să îl poată apela. Nucleul este cel responsabil pentru redirecționarea acestor printf-uri către unde ar trebui să meargă, fie că este VGA, serial sau altundeva. Deci, nu există nicio posibilitate, un „printf” în invitatul tău ar putea apărea în mod magic pe gazdă, cu excepția cazului în care oaspetele tău trimite acele mesaje undeva unde gazda le vede.
Puncte:0
drapel ng

După două zile de investigație, cred că în sfârșit aflu cheia întrebării.

printf trimite ieșiri atât în ​​modul text VGA (copiere în memoria tampon pentru modul text) cât și în portul serial. O dovadă este xv6 folosit în multe cursuri OS. The qemu-nox tinta in xv6Makefile-ul lui specifică -nografic. Dacă adăugăm -serial nici unul, xv6 va afișa doar monitorul QEMU (qemu).

Atât GRUB, cât și ubuntu shell (prin shell vreau să spun că bootarea este finalizată) utilizează printf funcţie. Cu toate acestea, diferența este: GRUB folosește serialul, dar Ubuntu dezactivează serialul în mod implicit. De aceea sub -nografic, GRUB poate afișa, dar shell-ul ubuntu nu. Acest lucru explică și de ce -blesteme le poate afișa pe amândouă.

Monitorul QEMU folosește normal printf de asemenea. Cu toate acestea, rulează în gazdă care a activat deja serialul, astfel încât să poată ieși în consola gazdei. Invitatul ubuntu dezactivează serialul în imaginea ISO, deci nu imprimă nimic sub -nografic.

Faza de pornire Ubuntu folosește doar modul text VGA. Fără serial chiar dacă este activat. Deci mesajele de pornire (precum și de închidere) nu pot fi afișate sub -nografic dar poate fi afișat sub -blesteme. Cred că se datorează luării în considerare a performanței, deoarece memoria de scriere directă (buffer în modul text) este mai rapidă decât printf care în plus face operaţii în serie.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.