Programowanie Systemów Wbudowanych OS Linux - Oprogramowanie rozruchowe Iwona Kochańska Katedra Systemów Elektroniki Morskiej WETI PG March 30, 2016
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 GUT Intel 2015/16 2/35 biblioteki i programy uruchamiane w systemie
Uruchamianie systemu Linux GUT Intel 2015/16 3/35
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. GUT Intel 2015/16 4/35
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. GUT Intel 2015/16 5/35
Sekwenca rozruchowa - old days Bootloader w pamięci nieulotnej w wektorze resetu pamięć NOR flash mapowana bezpośrednio na przestrzeń adresowa GUT Intel 2015/16 6/35
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 GUT Intel 2015/16 7/35
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) GUT Intel 2015/16 8/35
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; GUT Intel 2015/16 9/35
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
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 GUT Intel 2015/16 11/35
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 GUT Intel 2015/16 12/35
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 GUT Intel 2015/16 13/35
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. GUT Intel 2015/16 14/35
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) GUT Intel 2015/16 15/35
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 GUT Intel 2015/16 16/35
Drzewo urzadzeń Drzewo urzadzeń reprezentuje system jako hierarchiczny zbiór komponentów Pliki źródłowe drzew urzadzeń jadro Linuxa: arch /$ARCH/ boot / dts źródła U-boot: arch /$ARCH/ dts GUT Intel 2015/16 17/35
Drzewo urzadzeń rozpoczyna się od węzła (node) root-a, reprezentowanego przez / kolejne węzły reprezentuja podzespoły sprzętowe każdy węzeł ma nazwę i właściwości w formacie name = "value" GUT Intel 2015/16 18/35
Właściwość reg Węzły pamięci i CPU maja właściwość reg, która określa zakres wykorzystywanych adresów w rejestrach Dwie wartości całkowite (32-bitowe komórki ): adres poczatku i długość Jeśli adres lub rozmiar nie może być zapisany na 32 bitach (np. gdy adresowanie jest 64-bitowe), potrzebne sa cztery liczby całkowite ( komórki ) dla właściwości reg: Inforamcja o liczbie komórek zapisana jest jako #address-cells i #size_cells w węźle nadrzędnym GUT Intel 2015/16 19/35
Właściwość reg Węzły CPU: Dla procesorów 4-rdzeniowych moga być adresowane jako 0, 1, 2 i 3. Liczba komórek dla reg (węzeł CPU): #address-cells = <1> #size-cells = <0> Węzeł-dziecko cpu@0: reg = <0>. GUT Intel 2015/16 20/35
Phandles i interrupts Phandle - połaczenie w drzewie urzadzeń między komponentem a: kontrolerem przerwań, zegarem, regulatorem napięcia. węzeł interrupt-controller: #interrupt-cells - ile 4-bajtowych liczb reprezentuje linię przerwania? węzeł serial node, interrupt-parent - kontroler przerwań, do którego węzeł jest podłaczony (phandle). GUT Intel 2015/16 21/35
Drzewo urzadzeń - pliki nagłówkowe Rozszerzenie plików nagłówkowych:.dtsi. Dołaczanie zgodnie ze standardem Open Firmware: / i n c l u d e / " vexpress v2m. d t s i " Dołaczanie zapożyczone z języka C: # i n c l u d e " am33xx. d t s i " GUT Intel 2015/16 22/35
Kompilacja drzewa urzadzeń dtc - kompilator drzewa urzadzeń Wynik: plik binarny.dtb (device tree binary lub device tree blob) Przykładowa kompilcja prostego drzewa (bez plików nagłówkowych): $ dtc simpledts 1. dts o simpledts 1. dtb DTC: dts >dts on f i l e " simpledts 1. dts " Kompilacja drzewa z plikami nagłówkowymi - kbuild GUT Intel 2015/16 23/35
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 GUT Intel 2015/16 24/35
Przykład: Das U-Boot Das U-Boot Poczatkowo - program open source dla wbudowanych systemów PowerPC Następnie - w systemach ARM, MIPS, SH i x86. Utrzymywany przez Denx Software Engineering. www.denx.de/wiki/u-boot. GUT Intel 2015/16 25/35
Budowa U-Boot Kod źródłowy: $ g i t clone g i t : / / g i t. denx. de / u boot. g i t $ cd u boot $ g i t checkout v2015.07 katalog configs/ - ponad 1,000 plików konfiguracyjnych dla różnych platform sprzętowych Przykład: $ make CROSS_COMPILE=arm cortex_a8 l i n u x gnueabihf am335x_boneblack_defconfig GUT Intel 2015/16 26/35
Budowa U-Boot Wynik kompilacji: u-boot: U-Boot w formacie ELF dla debuggera u-boot.map: tablica symboli u-boot.bin: U-Boot w surowym formacie binarnym dla urzadzenia u-boot.img: u-boot.bin z nagłówkiem (dla załadowania do działajacego U-Boot) u-boot.srec: U-Boot w formacie Motoroli - do załadowania przez interfejs szeregowy MLO: Secondary Program Loader (SPL). GUT Intel 2015/16 27/35
Instalacja U-Boot Przez JTAG - ładowanie bezpośrednio do pamięci RAM Jeśli SoC ma rozruchowy ROM, może czytać program rozruchowy z różnych źródeł zewnętrznych (karta SD, interfejs szeregowy, USB) GUT Intel 2015/16 28/35
Instalacja U-Boot - karta SD Formatowanie pierwszej partycji karty jako FAT32 i oznaczenie jej jako bootowalnej: $ sudo mkfs. v f a t F 16 n boot / dev / mmcblk0p1 karta w slocie SD - widoczna jako /dev/mmcblk0 karta w czytniku kart - widoczna jako /dev/sdb, /dev/sdc, itd. Montowanie partycji i kopiowanie SPL: $ sudo mount / dev / mmcblk0p1 / media / sdcard $ cp MLO u boot. img / media / sdcard / boot Odmontowanie partycji. GUT Intel 2015/16 29/35
Format pliku obrazu dla programu rozruchowego Jak przygotować plik obrazu jadra OS dla U-Boot? U-Boot nie ma systemu plików. Używa 64-bitowych nagłówków Przygotowanie pliku dla U-Boot - program mkimage Przykład - przygotowanie pliku jadra dla procesora ARM $ mkimage A arm O l i n u x T ker nel C gzip a 0x80008000 e 0x80008000 n Linux d zimage uimage GUT Intel 2015/16 30/35
Ładowanie obrazu z pliku Ładowanie obrazu z pliku - zwykle z karty SD (sterownik mmc) lub sieci Typowa sekwencja ładowania obrazu: mmc - inicjalizuje ponownie sterownik mmc fatload - odczyt pliku w formacie FAT fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]] GUT Intel 2015/16 31/35
Ładowanie obrazu z sieci TFTP - Trivial File Transfer Protocol (TFTP) Wymagane: uruchomienie demona TFTP, tftpd konfiguracja firewall-i między komputerem a urzadzeniem (transmisja UDP, port 69) Kopiowanie plików: do katalogu /var/lib/tftpboot Dalsza konfiguracja (PC i urzadzenia maja przydzielone IP): GUT Intel 2015/16 32/35
Zapis obrazu do pamięci flash Zapis obrazu jadra do pamięci flash: Odczyt obrazu jadra z pamięci flash (do pamięci RAM): GUT Intel 2015/16 33/35
Uruchomienie jadra Linuxa adres jadra - konieczny, adresy ramdisk i dtb - opcjonalne kiedy nie ma ramdisk: U Boot# bootm 82000000 83000000 GUT Intel 2015/16 34/35
Rozruch automatyczny Automatyzacja procesu rozruchu - poprzez zmienne środowiskowe bootcmd - zmienna zawierajaca skrypt, który jest uruchamiany po N sekundach od właczenia zasilania (można przerwać odliczanie i prześć w tryb interakcji z użytkownikiem) zapis w bootcmd polecenia ładowania obrazu j adra z pamięci flash i uruchomienia go: GUT Intel 2015/16 35/35