1/67 Komputery Przemysłowe i Systemy Wbudowane OS Linux w wystemach wbudowanych Iwona Kochańska Katedra Systemów Elektroniki Morskiej WETI PG October 5, 2016
Systemy wbudowane - OS 2/67
Systemy wbudowane - języki programowania 3/67
Elementy wbudowanego OS Linux Toolchain kompilator i inne narzdzia do tworzenia kodu dla urzadzeń Bootloader inicjalizuje platform sprzętowa oraz ładuje jadro systemu Kernel serce systemu, zarzadza zasobami i komunikuje się ze sprzętem Root filesystem 4/67 biblioteki i programy uruchamiane w systemie
Co to jest toolchain? Toolchain - zestaw narzędzi do kompilacji kodu źródłowego do plików wykonywalnych na platformie docelowej: kompilator linker biblioteki współdzielone Za pomoca narzędzi toolchain można zbudować podstawowe elementy OS dla systemu wbudowanego: program rozruchowy (bootloader) jadro systemu (kernel) system plików (root filesystem) 5/67
Co to jest toolchain? Toolchain powinien kompilować kod źródłowy w języku asemblera, C i C++ (w tych językach napisane sa kody źródłowe OS linux) Toolchain Linux składa się z elementów GNU project (http://www.gnu.org) Alternatywa - kompilator Clang i zwi azany z nim LLVM project (http://llvm.org) 6/67
Elementy toolchain Binutils narzędzia binarne: assembler, linker, ld GCC kompilatory C i innych języków: C++, Objective-C, Objective- C++, Java, Fortran, Ada, i Go Biblioteka C ustandaryzowane API zgodne ze specyfikacja POSIX (podstawowe API jadra OS)... oraz kopia plików nagłówkowych jadra Linuxa. 7/67
Toolchain Podstawowe definicje: build: platforma lokalna, na której realizowana jest kompilacja (na przykład PC z dystrybucja Debiana) target: platforma docelowa (na przykład Raspberry Pi) host: OS dostarczajacy wirtualnego środowiska guest: OS w środowisku wirtualnym 8/67
Rodzaje toolchain-ów Natywny (np. w komputerach typu desktop) build machine host machine target machine arch. A arch. A arch. A Kompilacja skrośna (cross-compilation) build machine host machine target machine arch. A arch. A arch. B 9/67
Rodzaje toolchain-ów Natywny skrośny (cross-native) build machine host machine target machine arch. A arch. B arch. B Canadian build machine host machine target machine arch. A arch. B arch. C 10/67
Kompilacja skrośna Dwa podstawowe problemy kompilacji skrośnej: Wszystkie pliki nagłówkowe i biblioteki C/C++ dla platformy docelowej musza być dostępne na platformie kompilujacej (build). Kompilator powinien wygenerować kod właściwy dla platformy docelowej (target). 11/67
Architektury CPU Toolchain powinien być dostosowany do właściwości CPU platformy docelowej (target): Architektury CPU: arm, mips, x86_64, itd. Big- lub little-endian: niektóre CPU moga pracować w obu trybach, ale kod maszynowy jest inny dla każdego z nich Wsparcie operacji na liczbach zmiennoprzecinkowych: sprzętowe lub programowe Application Binary Interface (ABI): reguły współpracy (przekazywania parametrów) między programami, bibliotekami, a systemem operacyjnym. Dotyczy oprogramowania w wersji binarnej. 12/67
Rodzaje ABI dla procesorów ARM OABI - Old Application Binary Interface (OABI) - nie kontynuowany po roku 2011 EABI - Extended/Embedded Application Binary Interface (EABI) dynamiczne linkowanie nie jest wymagane organizacja stosu bardziej kompaktowa niż w systemie ogólnego przeznaczenia rejestry całkowite (ogólnego przeznaczenia) EABIHF - Hard Float Extended Application Binary Interface - rejestry zmiennoprzecinkowe 13/67
GNU prefix GNU prefix - złożony z trzech lub czterech elementów oddzielonych myślnikami: CPU: arm, mips, x86_64, el = little-endian, eb = big-endian; np. armeb = big-endian ARM Dostawca OS, np. Poky Jadro, np. linux OS: nazwa przestrzeni użytkownika (gnu lub uclibc gnu). Może być dołaczony rodzaj ABI (gnueabi, gnueabihf, uclibcgnueabi, lub uclibcgnueabihf). $ gcc dumpmachine x86_64 l i n u x gnu 14/67
Biblioteka C Application C library Linux kernel Interfejs programistyczny zdefiniowany jest w języku C (standard POSIX) Bilbioteka C to implementacja tego interfejsu (do komunikacji programu z jadrem systemu) Biblioteka C używa wywołań systemowych w celu uzyskania dostępu do usługi jadra (przejście między przestrzenia użytkownika a przestrzenia jadra) 15/67
Biblioteki C glibc - standardowa GNU C, najbardziej kompletna implementacja POSIX API eglibc - wbudowana GLIBC łatki do glibc dodajace opcje konfiguracji i wsparcie dla architektur nie obsługiwanych przez glibc właczona do glibc poczawszy od wersji 2.20 uclibc - C dla mikrokontrolerów zaprojektowana do współpracy z uclinux (Linux dla CPUs bez jednostki zarzadzania pamięcia) obecnie współpracuje z pełnym Linuxem musl libc - nowa biblioteka C dla systemów wbudowanych 16/67
Outline Toolchain Kompilacja natywna Kompilacja skrośna Bootloader 17/67
GNU Compiler Collection GNU Compiler Collection (GNU C Compiler): 1987: Richard Stallman, założyciel GNU Project, postanowił opracować kompilator, który spełniałby wymagania wolnego oprogramowania (Free Software). kompilator GNU C szybko stał się popularny wśrod programistów wolnego oprogramowania ze względu na swoja przenośność. Dziś GCC obsługuje różne języki programowania: C i C++, Ada, Fortran, Objective C, Java. Jadra systemów Linux napisane sa w języku C i skompilowane za pomoca GCC. GCC współpracuje z procesorami o różnych architekturach: Intel IA32 ("x86"). AMD64, SPARC POWER/PowerPC oraz rosnac a liczba procesorów wyspecjalizowanych. If it s commercially available, GCC can probably compile code for it! 18/67
Kompilacja pojedynczego pliku Proces budowy programu: compile assembly link Kompilator: tłumaczy kod programu na język maszynowy (specificzny dla danej rodziny procesorów) Assembler: tłumaczy skompilowane źródło na binarna reprezentację kodu maszynowego. nadaje każdej instrukcji maszynowej adres pamięci (ale nie bezwzględny, raczej symbolicznie lub jako przesunięcie). tworzy listę wszystkich nierozwiazanych referencji, które prawdopodobnie zdefiniowane sa w innych plikach programu Linker: ł aczy kod z plików wygenerowanych przez assembler (object code) w tzw. plik-kontener, który może być załadowany do pamięci i wykonany na danej platformie sprzętowej. 19/67
Program w pamięci pamięć stos (adresy powrotu i zmienne lokalne) sterta (zmienne dynamiczne) zmienne statyczne program wysoki adres niski adres 20/67
Kompilacja Domyślnie GCC wykonuje wszystkie kroki potrzebne do zbudowania wykonywalnego pliku binarnego, jednak sam dokonuje jedynie kompilacji. Assembler i Linker to osobne narzędzia GNU Toolchain, z którymi komunikuje się kompilator. Zwyczajowo plik wykonywalny dostaje nazwę a.out, chyba że użytkownik zdefiniuje ja inaczej za pomoca opcji -o kompilatora gcc. 21/67
Kompilacja jednego źródła C Przykład "Hello World" kod źródłowy: / Embedded Systems Programming H e l l o World / # i n c l u d e < s t d i o. h> # i n c l u d e < s t d l i b. h> i n t main ( i n t argc, char argv ) { p r i n t f ( " Hello, World! \ n " ) ; r e t u r n ( 0 ) ; } kompilacja: $ gcc o h e l l o h e l l o. c test: $. / h e l l o Hello, World! 22/67
Kompilacja wielu źródeł C GNU linker potrafi łaczyć ze soba kilka plików objektów.o w jeden plik wykonywalny. Przykład: message.c: # i n c l u d e < s t d i o. h> void goodbye_world ( void ) { p r i n t f ( " Goodbye, World! \ n " Kompilacja message.c: gcc c message. c Sterownik (driver) GCC woła swój wewnętrzny kompilator, przetwarza kod źródłowy na język maszynowy i przekazuje go na wejście zewnętrznego assemblera. Assembler tworzy plik z rozszerzeniem.o, który może być połaczony przez GNU linker z innymi plikami.o. 23/67
Kompilacja wielu źródeł C goodbye.c: # i n c l u d e < s t d l i b. h> void goodbye_world ( void ) ; i n t main ( i n t argc, char argv ) { goodbye_world ( ) ; r e t u r n Kompilacja: gcc c goodbye. c Linkowanie: gcc o goodbye message. o goodbye. o Kompilacja i linkowanie w jednym poleceniu: gcc o goodbye message. c goodbye. c Uruchomienie programu:. / goodbye Goodbye, World! 24/67
Biblioteki zewnętrzne, GLIBC Niemal każda aplikacja Liux używa biblioteki GLIBC (biblioteka GNU C) podstawowe operacje wejścia/wyjścia (np. zamknięcie programu) cienka wartwa między aplikacja a jadrem Linuxa; implementacja podstawowych procedur, które byłyby bardziej kosztowne (złożone), gdyby były w jadrze. GCC zakłada, że GLIBC jest domyślnie dodawana do programu podczas etapu linkowania. Mimo to do źródeł programu należy dodać pliki nagłówkowe standardowych bibliotek 25/67
Biblioteki zewnętrzne, GLIBC Przykład: #include < s t d i o. h> #include < s t d l i b. h> #include <math. h> / / system math l i b r a r y ; p a r t of GL i n t main ( i n t argc, char argv ) {... } Kompilacja i linkowanie: gcc o t r i g lm t r i g. c opcja -lm powoduje, że GCC przeszukuje bibliotekę matematyczna libm Biblioteki systemowej UNIX (Linux) zwykle rozpoczynaja się od przedrostka lib i znajduja się w katalogu /lib lub /usr/lib. 26/67
Biblioteki statyczne a współdzielone Biblioteki statyczne (static) - podczas kompilacji programu kod biblioteki statycznej jest umieszczany w wynikowym pliku binarnym; każda funkcja ma tyle kopii, ile jest programów, które z niej korzystaja. Biblioteki współdzielone (shared) - tylko jedna wersja każdej funkcji współdzielona między aplikacjami; jest to możliwe dzięki pamięci wirtualnej - kilka niezależnych aplikacji ma bezpieczny dostęp do tego samego obszaru pamięci. Istnieja dzięki wynalezieniu pamięci wirtualnej Pozwalaja efektywnie wykorzystać pamięć, ponieważ wystarcza tylko jedna kopia danej biblioteki w pamięci Łatwo je aktualizować 27/67
Biblioteki statyczne a współdzielone Biblioteki współdzielone redukuja rozmiar pliku wynikowego Jeśli biblioteka jest współdzielona przez wiele różnych programów jednocześnie, pozostaje w pamięci i jest natychmiast dostępna. Biblioteka współdzielona powinna być zbudowana tak, by jej działanie było niezależne od miejsca w pamięci, do którego została załadowana: gcc fpic c message. c Flaga PIC informuje GCC, by w kodzie maszynowym programu nie umieszczał odwołań do adresów pamięci. Utworzenie biblioteki współdzielonej: (plik wyjściowy: libmessage.so): gcc shared o libmessage. so message. o 28/67
Biblioteki statyczne a współdzielone Użycie biblioteki współdzielonej: gcc o goodbye lmessage L. goodbye. o GCC informuje linkera, że ma połaczyć kod pliku main.o z biblioteka libmessage.so. flaga -L oznacza, że biblioteki moga znajdować się w bieżacym katalogu. Własna biblioteka współdzielona może być używana tak jak dostarczana wraz z dystrybucja Linux, pod warnkiem, że znajduje się w odpowiednim katalogu (np. /usr/lib/) ld-linux - dynamiczny linker; automatycznie uruchamiany, gdy uruchamiana jest aplikacja używajaca bibliotek współdzielonych. Poszukuje ich w katalogu /lib i /usr/lib (te domyślne ścieżki moga być zmienione w pliku konfiguracyjnym /etc/ld.so.conf. 29/67
Biblioteki statyczne a współdzielone ldd - przeszukuje domyślne systemowe ścieżki bibliotek współdzielonych i wypisuje wersje tych bibliotek, używane przez program: ldd goodbye Przykładowy komunikat narzędzia ldd dla programu goodbye: l i n u x vdso. so.1 (0 x00007ffc8f2bb000 ) libmessage. so => n o t found l i b c. so.6 => / l i b / x86_64 l i n u x gnu / l i b c. so.6 (0 x00007 / l i b 6 4 / ld l i n u x x86 64.so.2 (0 x00007fb6d458e000 ) Przy próbie uruchomienia programu pojawi się bład:. / goodbye. / goodbye : e r r o r while loading shared l i b r a r i e s : libmessage. so : cannot open shared o b j e c t f i l e : No suc 30/67
Biblioteki statyczne a współdzielone Rozwiazanie: instalacja libmessage.so w katalogach standardowych ustawienie zmiennej środowiskowej LD_LIBRARY_PATH na dodatkowa ścieżkę bibliotek współdzielonych: export LD_LIBRARY_PATH=$ ( pwd ) po tej operacji ldd zwróci: l i n u x vdso. so.1 (0 x00007ffd78552000 ) libmessage. so => / opt / cpp_examples / libmessage. so (0 x0 l i b c. so.6 => / l i b / x86_64 l i n u x gnu / l i b c. so.6 (0 x00007 / l i b 6 4 / ld l i n u x x86 64.so.2 (0 x00007fc909fd5000 ) 31/67
GNU Binutils GNU Binutils - zbiór narzędzi do tworzenia i obróbki plików wykonywalnych. Składa się z: asemblera (GNU Assembler) linkera (GNU Linker) biblioteki obsługi różnych formatów plików z kodem narzędzi do obróbki plików z kodem (np. objdump) Binutils jest używany jako back-end przez GCC, ale też wiele innych programów operujacych na kodzie. 32/67
GNU Assembler Przetwarza kod skompilowany do języka maszynowego w kod nadajacy się do wykonania przez konkretny procesor GNU as obsługuje wiele różnych rodzin mikroprocesorów (włacznie z Intel IA32, czyli x86) GNU as w danym systemie Linux jest wstępnie skonfigurowany do pracy z procesorem, na którym pracuje ów system, jednak można ta konfigurację zmienić (cross-compilation!) Język maszynowy programu Hello World: gcc S h e l l o. c Kompilacja źródła hello.s: as o h e l l o. o h e l l o. s 33/67
GNU Linker Aby kod programu był wykonywalny, musi on zostać sformatowany do postaci ELF (Executable and Linkable Format), zrozumiałej przez systemy UNIX. Format ten obowiazuje: pliki wykonywalne, pliki obiektowe, bibliotki współdzielone zrzuty pamięci Za formatowanie do ELF odpowiedziany jest linker. Linker jest również odpowiedzialny za sprawdzenie, czy kod uruchamiany podczas startu (plik crtbegin.o automatycznie dołaczany do aplikacji) oraz zamykania aplikacji (crtend.o) znajduje się w prawidłowym miejscu kodu wykonywalnego 34/67
GNU Linker objcopy - kopiuje i przekształca pliki obiektowe generowane przez kompilator objdump - zapisuje zawartość wykonywalnych plików binarnych w formacie tekstowym; wizualizuje zawartość plików wykonywalnych. Przykład: $ objdump x d S h e l l o 35/67
Outline Toolchain Kompilacja natywna Kompilacja skrośna Bootloader 36/67
Kompilacja skrośna Pobieramy pliki z repozytorium, np: h t t p s : / / github. com / Christopher83 / arm cortex_a8 l i n u x Ścieżka do toolchain-a: arm cortex_a8 l i n u x gnueabi / bin / Dodanie ścieżki do zmiennej PATH: $ PATH = /... / arm cortex_a8 l i n u x gnueabihf / bin :$PATH Kompilacja helloworld.c: $ arm cortex_a8 l i n u x gnueabihf gcc h e l l o w o r l d. c o h e l l o w o r l d Sprawdzenie rodzaju pliku wykonywalnego: $ f i l e h e l l o w o r l d h e l l o w o r l d : ELF 32 b i t LSB executable, ARM, version 1 (SYSV), dynamically l i n k e d 37/67 ( uses shared l i b s ), f o r GNU/ Linux 3. 1 5. 4,
Kompilacja skrośna Sprawdzenie wersji kompilatora: $ arm cortex_a8 l i n u x gnueabi gcc version Sprawdzenie konfiguracji kompilatora: $ arm cortex_ a8 l i n u x gnueabi gcc v Lista opcji kompilatora zależnych od architektury maszyny docelowej: $ arm cortex_a8 l i n u x gnueabihf gcc t a r g e t help 38/67
Kompilacja skrośna Toolchain sysroot - katalog z folderami dla bibliotek, plików nagłówkowych i innych plików konfiguracyjnych ścieżka może być ustawiona podczas konfiguracji toolchain-a za pomoca: with sysroot= lub podczas jego wywołania za pomoca: sysroot= Sprawdzenie ścieżki domyślnej sysroot: $ arm cortex_a8 l i n u x gnueabi gcc p r i n t sysroot 39/67
Kompilacja skrośna Sysroot zawiera: lib: objekty współdzielone dla biblioteki C i dynamicznego linkera, ld-linux usr/lib: archiwym bibliotek statycznych usr/include: pliki nagłówkowe wszystkich bibliotek usr/bin: narzędzia uruchamiane na maszynie docelowej (np. komenda ldd) usr/share: pliki niezależne od maszyny docelowej sbin: zawiera narzędzie ldconfig do zarz adzania cache-owaniem bibliotek współdzielonych 40/67
Narzędzia toolchain-a Polecenie addr2line ar as c++filt cpp elfedit g++ gcc gcov gdb gprof Opis tłumaczy adresy na numery linii tworzy biblioteki statyczne GNU assembler przetwarza symbole C++ i Java C preprocessor edycja nagłówka pliku ELF front-end GNU C++ front-end GNU C narzędzie analizy pokrycia kodu (code coverage) GNU debugger narzędzie analizy wydajności programu 41/67
Narzędzia toolchain-a Polecenie ld nm objcopy objdump ranlib readelf size strings strip Opis GNU linker wyświetla nazwy symboliczne z plików wynikowych kopiuje i tłumaczy pliki objektowe wyświetla informacje z plików obiektowych tworzy lub modyfikuje indeks bibliotek statycznych wyświetla inforamcje o plikach ELF lista rozmiarów sekcji i całkowity rozmiar wyświetla łańcuchy ( drukowalne ) z pliku usuwa symbole z plików wynikowych 42/67
Biblioteka C Cztery główne części biblioteki implementuja składowe standardu POSIX: libc: główna biblioteka (implementacja printf, open, close, read, write) libm: funkcje matematyczne (cos, exp, log) libpthread: funkcje zwiazane z watkami (nazwy rozpoczynajace się od pthread_ ) librt: rozszerzenie czasu rzeczywistego (obsługa pamięci współdzielonej i asynchronicznego I/O) libc jest linkowana zawsze, pozostałe musza być dodane za pomoca opcji -l arm cortex_ a8 l i n u x gnueabihf gcc myprog. c o myprog lm 43/67
Biblioteka C Jakie biblioteki zostały dołaczone? $ arm cortex_a8 l i n u x gnueabihf r e a d e l f a myprog grep " Shared l i b r a r y " 0x00000001 (NEEDED) Shared l i b r a r y : [ libm. so. 6 ] 0x00000001 (NEEDED) Shared l i b r a r y : [ l i b c. so. 6 ] Jaki linker jest wołany podczas działania programu? (run-time linker): $ arm cortex_a8 l i n u x gnueabihf r e a d e l f a myprog grep " program i n t e r p r e t e r " [ Requesting program i n t e r p r e t e r : / l i b / ld l i n u x armhf. so. 3 ] 44/67
Biblioteki statyczne Statyczne linkowanie jest przydatne: gdy budowany system jest mały i składa się tylko z elementów BusyBox gdy program jest uruchamiany bez dostępu do systemu plików z bibliotekami runtime Linkowanie tylko bibliotek statycznych: $ arm cortex_a8 l i n u x gnueabihf gcc s t a t i c h e l l o w o r l d. c o h e l l o w orld s t a t i c 45/67
Biblioteki statyczne Tworzenie biblioteki statycznej: $ arm cortex_a8 l i n u x gnueabihf gcc c t e s t 1. c $ arm cortex_a8 l i n u x gnueabihf gcc c t e s t 2. c $ arm cortex_a8 l i n u x gnueabihf ar rc l i b t e s t. a t e s t 1. o t e s t 2. o Linkowanie libtest do programu helloworld: $ arm cortex_a8 l i n u x gnueabihf gcc h e l l o w o r l d. c l t e s t L.. / l i b s I.. / l i b s o h e l l o w o r l d 46/67
Biblioteki współdzielone Stworzenie biblioteki współdzielonej: $ arm cortex_a8 l i n u x gnueabihf gcc fpic c t e s t 1. c $ arm cortex_a8 l i n u x gnueabihf gcc fpic c t e s t 2. c $ arm cortex_a8 l i n u x gnueabihf gcc shared o l i b t e s t. so t e s t 1. o t e s t 2. o Flaga PIC informuje GCC, by generował kod bez referencji do konkretnych miejsc w pamięci Dołaczenie libtest do programu helloworld: $ arm cortex_a8 l i n u x gnueabihf gcc h e l l o w o r l d. c l t e s t L.. / l i b s I.. / l i b s o h e l l o w o r l d Linker będzie szukał libtest.so w domyślnej ścieżce /lib lub /usr/lib. Doł aczenie innych ścieżek bibliotek współdzielonych - w zmiennej LD_LIBRARY_PATH 47/67
Systemy do kompilacji skrośnej Proste makefiles, w których sterowanie toolchain-em odbywa się poprzez zmienna CROSS_COMPILE Narzędzie GNU Autotools Narzędzie CMake (https://cmake.org) 48/67
Makefiles Do pakietów prostych w kompilacji ( Linux kernel, U-Boot bootloader, Busybox) Toolchain prefix umieszczany w zmiennej CROSS_COMPILE, np: $ make CROSS_COMPILE=arm cortex_a8 l i n u x gnueabi Toolchain prefix ustawiany jako zmienna powłoki (shell variable): $ export CROSS_COMPILE=arm cortex_a8 l i n u x gnueabi $ make 49/67
GNU Autotools Autotools to zbiór narzędzi: GNU Autoconf GNU Automake GNU Libtool Gnulib Pakiety korzystajace z Autotools zawieraja skrypt o nazwie configure, który sprawdza zależności i generuje makefiles. Konfiguracja, budowa i instalacja dowolnego pakietu: $. / c o n f i g u r e $ make $ sudo make i n s t a l l 50/67
Uruchamianie systemu Linux 51/67
Co to jest bootloader? Program rozruchowy inicjalizuje system ładuje jadro OS do pamięci Uruchamianie systemu polega na przejściu kilku faz, w których coraz więcej zasobów jest dostępnych dla programu rozruchowego. 52/67
Co to jest bootloader? Ostateczny rezultat pracy bootloader-a to: jadro systemu operacyjnego załadowane do pamięci RAM uruchomione środowisko wykonawcze dla jadra (linia poleceń jadra systemu) jadro systemu dostaje wskaźnik do informacji o platformie sprzętowej Dodatkowo bootloader dostarcza trybu serwisowego do: aktualizacji konfiguracji procesu boot-owania, ładowania nowych obrazów programów rozruchowych do pamięci diagnostyki Kiedy j adro OS rozpoczyna wykonywanie swojego programu, bootloader nie jest dłużej potrzebny. 53/67
Sekwenca rozruchowa - old days Bootloader w pamięci nieulotnej w wektorze resetu pamięć NOR flash mapowana bezpośrednio na przestrzeń adresowa 54/67
Sekwenca rozruchowa - współcześnie Faza 1 kod ROM Faza 2 Secondary program loader (SPL) Faza 3 Tertiary program loader (TPL) Koniec Jadro OS w pamięci 55/67
Sekwenca rozruchowa. Faza 1: kod ROM kod ROM - uruchamiany po właczeniu zasilania; zapisany w SoC (system on a chip) podczas produkcji kod ROM potrafi zaadresować mał a przestrzeń SRAM dostępnej w SoC (4kB - kilkaset kb) 56/67
Sekwenca rozruchowa. Faza 1: kod ROM Kod ROM ładuje niewielki program rozruchowy do SRAM. Odczytuje go z: pierwszych stron pamięci NAND flash, pamięci flash dołaczonej przez SPI (Serial Peripheral Interface), pierwszych sektorów urzadzenia MMC (karty SD), strumienia bajtów z interfejsu Ethernet, USB lub UART; 57/67
Sekwenca rozruchowa. Faza 2: SPL Secondary program loader (SPL). SPL uruchamia m.in. kontroler pamięci by móc załadować kolejna część programu rozruchowego (TPL) do pamięci DRAM SPL czyta program z urzadzeń jak kod ROM (z odpowiednim przesunięciem adresu) lub z pliku, np. u-boot.bin. SPL zwykle nie pozwala na żadn a interakcję z użytkownikiem, ale drukuje w konsoli informację o wersji i postępie 58/67
Sekwenca rozruchowa. Faza 3: TPL Pełny program rozruchowy (np. U-Boot lub Barebox). Prosta linia poleceń użytkownika - polecenia typu załaduj nowy obraz jadra do pamięci Efektem działania TPL jest jadro OS w pamięci W systemach wbudowanych programy rozruchowe sa usuwane z pamięci po uruchomieniu jadra OS 59/67
Rozruch z programem układowym UEFI (UEFI firmware) UEFI - Universal Extensible Firmware Interface (UEFI) standard (http://www.uefi.org) Faza 1 Procesor ładuje UEFI boot manager firmware z pamięci flash. Możliwa interakcja z użytkownikiem przez interfejs tekstowy lub graficzny Faza 2 Boot manager ładuje boot firmware z EFI System Partition (ESP) lub dysku twardego/ssd (lub z serwera sieciowego przez PXE). Format partycji to FAT32. Faza 3 Bootloader ładuje jadro OS do pamięci 60/67
Rozruch z UEFI TPL powinien znajdować się w pliku: < e f i _ s y s t e m _ p a r t i t i o n >/ boot / boot <machine_type_short_name >. e f i Na przykład dla maszyny x86_64: / e f i / boot / bootx64. e f i 61/67
Rozruch z UEFI Programy TPL: GRUB 2 GNU Grand Unified Bootloader, wersja 2, Najczęściej stosowany z OS Linux na platformach PC https://www.gnu.org/software/grub/. gummiboot Zintegorwany z systemd (menadżer systemu i usług) Licencja LGPL v2.1 https://wiki.archlinux.org/index.php/systemd-boot. 62/67
Programy rozruchowe Nazwa Das U-Boot Barebox GRUB 2 RedBoot CFE YAMON Architektura ARM, Blackfin, MIPS, PowerPC, SH ARM, Blackfin, MIPS, PowerPC X86, X86_64 ARM, MIPS, PowerPC, SH Broadcom MIPS MIPS 63/67
Od programu rozruchowego do jadra OS Informacje przekazywane przez program rozruchowy do jadra OS: Podstawowe informacje o wykrytym sprzęcie (rozmiar fizycznej RAM, szybkość zegara CPU) Architektury PowerPC i ARM - unikatowy numer rodzaju SoC [Opcjonalnie] lokalizacja i rozmiar binarnego drzewa urzadzeń (device tree binary, dtb) [Opcjonalnie] lokalizacja i rozmiar minimalnego systemu plików (initial RAM disk) 64/67
Drzewo urzadzeń Drzewo urzadzeń (device tree) - definiuje sprzęt systemu komputerowego plik z rozszerzeniem.dts zwykle przekazywane do jadra OS przez program rozruchowy, może też być przyklejone do jadra na stałe Format - OpenBoot (Sun Microsystems) sformalizowany jako specyfikacja Open Firmware, IEEE standard IEEE1275-1994 (maszyny PowerPC, potem ARM i inne). http://devicetree.org 65/67
Po uruchomieniu jadra... Jadro szuka głównego systemu plików, którym może być: initramfs obraz systemu plików podany jako root= w linii poleceń jadra Jadro wykonuje program, którym domyślnie jest: /init dla initramfs, /sbin/init dla zwykłego systemu plików Program init uruchamiany jest z uprawnieniami root-a. Jest to pierwszy proces w systemie operacyjnym, więc otrzymuje PID 1 Jeśli init nie może zostać uruchomiony, wystapi kernel panic Po procesie init dziedzicza wszystkie inne procesy w systemie 66/67
Zadania programu-demona init Init zarzadza cyklem życia OS, od uruchomienia do zamknięcia: Podczas rozruchu systemu - uruchamia programy-demony i konfiguruje parametry systemu [opcjonalnie] uruchamia program-demon getty w terminalach, który umożliwia logowanie Adoptuje osierocone procesy (w wyniku nagłego zamknięcia procesu-rodzica i braku innych procesów w grupie watków) Odpowiada na nagłe zamknięcie procesów-dzieci poprzez przechwycenie sygnału SIGCHLD (zapobieganie tworzeniu procesów-zombie) Uruchamia ponownie programy-demony Obsługuje proces zamykania OS 67/67