Zrozumienie sprzętu printf

Zastanawiałem się, czy są jakieś dostępne w Internecie zasoby, które wyjaśniają, co się dzieje z czymś, na przykład printf of C, które wyjaśnia, co dzieje się na bardzo niskim poziomie (BIOS/wywołania jądra)

 12
Author: tipu, 2010-03-16

5 answers

Linux:

Printf() ---> printf () w bibliotece C ---> write () w bibliotece C ---> write () wywołanie systemowe w jądrze.

Aby zrozumieć interfejs pomiędzy przestrzenią użytkownika a przestrzenią jądra, musisz mieć pewną wiedzę na temat działania wywołań systemowych.

Aby zrozumieć, co dzieje się na najniższych poziomach, musisz przeanalizować kod źródłowy w jądrze .

The szybkie Wywołanie Systemu Linux Bibliografia (link pdf) może być przydatny, ponieważ określa, gdzie w źródle jądra możesz zacząć szukać.

 27
Author: jschmier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 20:23:46

Coś Jak printf, a konkretnie printf? To trochę niejasne.

Printf wysyła strumień do pliku stdout*; to, z czym jest związane, jest zależne od systemu i może być ponadto przekierowane do dowolnego innego urządzenia strumieniowego, dla którego system operacyjny zapewnia odpowiedni sterownik urządzenia. Pracuję w systemach wbudowanych i najczęściej standardowo stdout jest domyślnie kierowany do UART dla szeregowych We/Wy - często jest to jedyne obsługiwane urządzenie We / Wy stream i nie można go przekierować. W GUI OS dla aplikacje w trybie konsoli, wyjście jest "rysowane" graficznie w zdefiniowanej przez system czcionce terminala do okna, na przykład w Windows może to obejmować wywołania GDI lub DirectDraw, które z kolei uzyskują dostęp do sterownika urządzenia wideo. W nowoczesnym systemie operacyjnym Desktop wyjście znaków konsoli nie obejmuje BIOS-u w ogóle, poza być może początkowym bootstrapowaniem.

Krótko mówiąc, zazwyczaj istnieje ogromna ilość oprogramowania pomiędzy wywołaniem printf () a sprzętem, na którym jest ono wyprowadzane.

 4
Author: Clifford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 20:51:15

Jest to bardzo specyficzne dla platformy. Z punktu widzenia sprzętowego, back-endowa implementacja printf() może być skierowana do portu szeregowego, niesterowego wyświetlacza LCD itp. Naprawdę zadajesz dwa pytania:

  1. Jak printf() interpretuje argumenty i formatuje łańcuch znaków, aby wygenerować poprawne wyjście?

  2. Jak wyjście z printf() do urządzenia docelowego?

Należy pamiętać, że system OPERACYJNY, Jądro i BIOS nie są wymagane do funkcja. Wbudowane aplikacje zazwyczaj mają funkcję printf() i inne procedury IO zapisujące do bufora pierścienia znaków. Przerwanie może następnie przepytywać bufor i manipulować sprzętem wyjściowym (LCD, port szeregowy, pokaz laserowy itp.), Aby wysłać buforowane wyjście do właściwego miejsca docelowego.

 1
Author: 3Dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 20:06:42

Z definicji BIOS i wywołania jądra są specyficzne dla platformy. Jaka Platforma Cię interesuje? Kilka linków do informacji związanych z Linuksem zostało już zamieszczonych.

Zauważ również, że printf może nawet nie spowodować wywołania BIOSu lub jądra, ponieważ twoja platforma może nie mieć jądra lub BIOSu (dobrym tego przykładem są systemy wbudowane).

 1
Author: bta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 20:17:15

Printf () pobiera wiele argumentów (funkcja argumentów o zmiennej długości). Użytkownik dostarcza ciąg znaków i argumenty wejściowe.

Funkcja printf() tworzy wewnętrzny bufor do konstruowania ciągu wyjściowego. Teraz printf() przechodzi przez każdy znak łańcucha użytkownika i kopiuje go do wyjściowego łańcucha. Printf () zatrzymuje się tylko na "%".

" % " oznacza, że istnieje argument do konwersji (argumenty mają postać char, int, long, float, double lub string). Przekształca go do string i dopisuje do bufora wyjściowego. Jeśli argument jest ciągiem znaków, to wykonuje kopię ciągu znaków.

W końcu printf() może dotrzeć do końca żądań użytkownika i skopiować cały bufor do pliku stdout.

 0
Author: Palak Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-13 09:11:57