Programowanie Systemów Wbudowanych OS Linux - Oprogramowanie rozruchowe Iwona Kochańska Katedra Systemów Elektroniki Morskiej WETI PG March 2, 2017
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/36 biblioteki i programy uruchamiane w systemie
Uruchamianie systemu Linux GUT Intel 2015/16 3/36
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/36
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/36
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/36
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/36
Sekwenca rozruchowa. Faza 1: kod ROM SPL - secondary program loader 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) GUT Intel 2015/16 8/36
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/36
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 10/36
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/36
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/36
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: < 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: / efi /boot/bootx64.efi GUT Intel 2015/16 13/36
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 14/36
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 15/36
Przed drzewem urzadzeń Jadro OS zawierało cała wiedzę o sprzęcie GUT Intel 2015/16 16/36
Przed drzewem urzadzeń J adro OS nie zawiera informacji o platformie sprzętowej. Osobny plik binarny: device tree blob (dtb) GUT Intel 2015/16 17/36
Drzewo urzadzeń Drzewo urz adzeń reprezentuje system jako hierarchiczny zbiór komponentów GUT Intel 2015/16 18/36
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 19/36
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 20/36
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 21/36
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 22/36
Drzewo urzadzeń źrodło: http://free-electrons.com/pub/conferences/2013/elce/petazzoni-device-treedummies/petazzoni-device-tree-dummies.pdf GUT Intel 2015/16 23/36
Drzewo urzadzeń - pliki 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 " 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): $ d t c simpledts 1. d t s 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 24/36
Kompilacja drzewa urzadzeń źrodło: http://free-electrons.com/pub/conferences/2013/elce/petazzoni-device-treedummies/petazzoni-device-tree-dummies.pdf GUT Intel 2015/16 25/36
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 26/36
(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 27/36
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 28/36
Das U-Boot Pobranie kodu źródłowego: $ g i t clone g i t : / / g i t. denx. de / u boot. g i t $ cd u boot katalog configs/ - ponad 1,000 plików konfiguracyjnych dla różnych platform sprzętowych konfiguracja dla Raspberry Pi ver. 2: $ make r p i _ 2 _ d e f c o n f i g $ make a l l UWAGA! W systemie hosta musi być zainstalowany toolchain do kompilacji skrośnej programów dla RPi! GUT Intel 2015/16 29/36
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ć: ke rnel =u boot. bin GUT Intel 2015/16 30/36
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 31/36
Nagranie plików u-boot na kartę 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 nagranie u-boot.img $ sudo mount / dev / mmcblk0p1 / media / sdcard $ cp MLO u boot. img / media / sdcard / boot Odmontowanie partycji. GUT Intel 2015/16 32/36
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 33/36
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 34/36
Ł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 35/36
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 36/36