Uczę się sterowników urządzeń i programowania jądra. Według książki Jonathana Corbeta main()
w sterownikach urządzeń nie ma żadnej funkcji.
Więc mam dwa pytania:
- Dlaczego nie potrzebujemy
main()
funkcji w sterownikach urządzeń? - Czy samo jądro ma jakąś
main()
funkcję?
Czy ktoś może mi to wyjaśnić?
linux-kernel
drivers
ktoś
źródło
źródło
Odpowiedzi:
W programach kosmicznych użytkownika
main()
jest punktem wejścia do programu, który jest wywoływany przez kod inicjujący libc podczas wykonywania pliku binarnego. Kod jądra nie ma luksusu polegać na libc, ponieważ sam libc opiera się na interfejsie syscall jądra do alokacji pamięci, we / wy, zarządzania procesami itp.To powiedziawszy, odpowiednikiem
main()
kodu w jądrze jeststart_kernel()
, który jest wywoływany przez bootloader po załadowaniu obrazu jądra, dekompresuje go do pamięci i konfiguruje niezbędny sprzęt i stronicowanie pamięci.start_kernel()
wykonuje większość konfiguracji systemu i ostatecznie uruchamia proces inicjowania.Punktem wejścia do modułów jądra systemu Linux jest funkcja init, która jest rejestrowana w jądrze przez wywołanie
module_init()
makra. Zarejestrowana funkcja inicjująca moduł jest następnie wywoływana przez kod jądra poprzezdo_initcalls()
funkcję podczas uruchamiania jądra.źródło
main
metody w C. (Jest to zbyt powszechnie uznawane błędne przekonanie, że system operacyjny wykonuje bezpośrednie wywołaniemain
, co nie jest przypadkiem, a tym bardziej w przypadku np. C ++.) I ' d, dam ci jeszcze jedną opinię, gdybym tylko mógł.Jądro nie ma
main
funkcji.main
jest koncepcją języka C. Jądro jest napisane w C i asemblerze. Kod wejścia jądra jest zapisywany przez asembler.Sekwencja rozruchowa jest zorganizowana w następujący sposób:
initrd
). Następnie wykonywany jest kod pod jakimś adresem.init
proces), przełącza kontekst CPU z pierścienia 0 na pierścień 3 i rozpoczyna proces inicjowania (identyfikator procesu to 1). Teraz rozruch jądra jest zakończony!init
Program uruchamia wszystkie skrypty startowe. Wszystkie usługi są uruchomione. Nazywa się Shell. Użytkownicy mogą się zalogować.Ta
main
funkcja jest funkcją C. Właściwie główną metodą nie jest punkt wejścia programów C. Środowisko wykonawcze C wywołuje wcześniej wiele funkcjimain
. GCC ma rozszerzoną funkcję: konstruktory. Funkcje zadeklarowane jako „konstruktor” są wywoływane wcześniejmain
.Na przykład:
To makro pochodzi z projektu qemu.
źródło
initrd.img
NIE JEST obraz jądra. Jest to zestaw modułów ładowanych przez jądro podczas rozruchu. Obrazy jądra zwykle mają nazwy zaczynające się od „vmlinuz”, ale różnią się od dystrybucji do dystrybucji.W arch / x86 / boot / main.c znajduje się np. Funkcja main () służąca do przygotowania systemu do przejścia z trybu rzeczywistego do chronionego, ale inne architektury nie mają takiego kodu. Jest ładny przegląd tego, jak działa uruchamianie jądra Linux 2.6.x na platformie x86. Naprawdę warto to przeczytać.
Zgodnie z dokumentem HOWTO do tworzenia jądra Linuksa, jądro Linuksa jest
co zgodnie z normą C BTW to oznacza
źródło