Programowanie Systemów Wbudowanych OS Linux - Oprogramowanie rozruchowe Iwona Kochańska Katedra Systemów Elektroniki Morskiej WETI PG March 3, 2019
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/33 biblioteki i programy uruchamiane w systemie
Uruchamianie systemu Linux GUT Intel 2015/16 3/33
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/33
Rezultat pracy bootloader-a 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/33
Sekwenca rozruchowa - old days Bootloader w pamięci nieulotnej w wektorze resetu pamięć flash mapowana bezpośrednio na przestrzeń adresowa GUT Intel 2015/16 6/33
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/33
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ń pamięci SRAM dostępnej w SoC (4kB - kilkaset kb) SPL - secondary program loader Kod ROM ładuje niewielki program rozruchowy do SRAM 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 8/33
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 GUT Intel 2015/16 9/33
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 10/33
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 11/33
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. TPL powinien znajdować się w pliku: < efi_system_partition >/ boot / boot < machine_type_short_name >. efi Na przykład dla maszyny x86_64: /efi/boot/bootx64.efi GUT Intel 2015/16 12/33
Od programu rozruchowego do jadra OS Informacje przekazywane przez program rozruchowy do jadra OS: [Zawsze]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 13/33
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 14/33
Przed drzewem urzadzeń Jadro OS zawierało cała wiedzę o sprzęcie GUT Intel 2015/16 15/33
Z drzewem urzadzeń J adro OS nie zawiera informacji o platformie sprzętowej. Osobny plik binarny: device tree blob (dtb) GUT Intel 2015/16 16/33
Drzewo urzadzeń Drzewo urz adzeń reprezentuje system jako hierarchiczny zbiór komponentów GUT Intel 2015/16 17/33
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/33
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/33
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/33
Referencja do innego węzła (phandle) Phandle (<&node>) - 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/33
Drzewo urzadzeń - pliki Pliki nagłówkowe Rozszerzenie plików nagłówkowych:.dtsi. Dołaczanie zgodnie ze standardem Open Firmware: / include / " vexpress - v2m. dtsi " Dołaczanie zapożyczone z języka C: # include " am33xx. dtsi " Plik binarny 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 file " simpledts -1. dts " Kompilacja drzewa z plikami nagłówkowymi - kbuild GUT Intel 2015/16 22/33
Problemy z pisaniem programu rozruchowego.. Uruchomienie prostego Hello World w działajacym OS - środowisko uruchomieniowe (runtime) Uruchomienie programu przez Bootloader - każdy potrzebny zasób musi być zainicjalizowany i zaalokowany Brak dostępu do pamięci operacyjnej = brak stosu Dostęp do pamięci operacyjnej - kontroler DRAM DRAM musi być sekwencyjnie odświeżana zgodnie ze schematem czasowym definiowanym przez producenta Ładowanie programu z pamięci nieulotnej (flash) do DRAM GUT Intel 2015/16 23/33
(Mniej lub bardziej) uniwersalne 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/33
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/33
Das U-Boot Pobranie kodu źródłowego: $ git clone git :// git. denx.de/u- boot. git $ cd u- boot katalog configs/ - ponad 1,000 plików konfiguracyjnych dla różnych platform sprzętowych konfiguracja dla Raspberry Pi ver. 2: $ make rpi_2_defconfig $ make all UWAGA! W systemie hosta musi być zainstalowany toolchain do kompilacji skrośnej programów dla RPi! GUT Intel 2015/16 26/33
Uruchamianie 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) W przypadku Raspberry Pi należy w pliku config.txt zapisać: kernel =u- boot. bin GUT Intel 2015/16 27/33
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) W przypadku Raspberry Pi - interfejs szeregowy GUT Intel 2015/16 28/33
Nagranie plików u-boot na kartę SD Formatowanie pierwszej partycji karty jako FAT32 i oznaczenie jej jako bootowalnej: $ sudo mkfs. vfat -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 nagranie u-boot.img $ sudo mount / dev / mmcblk0p1 / media / sdcard $ cp MLO u- boot. img / media / sdcard / boot Odmontowanie partycji. GUT Intel 2015/16 29/33
Instalacja U-Boot - Raspberry Pi Interakcja z u-boot na Rapsberry Pi (tryb ręczny rozruchu) fatload - odczyt pliku w formacie FAT. Składnia: fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]] mmc - urzadzenie pamięci masowej GUT Intel 2015/16 30/33
Format pliku obrazu jadra 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 linux -T kernel -C gzip -a 0x80008000 -e 0 x80008000 -n Linux -d zimage uimage GUT Intel 2015/16 31/33
Ł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/33
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/33