Programowanie Systemów Wbudowanych Systemy budowy OS Linux Iwona Kochańska Katedra Systemów Elektroniki Morskiej WETI PG April 27, 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/54 biblioteki i programy uruchamiane w systemie
Budowa oprogramowania systemu wbudowanego Budowa oprogramowania systemu wbudowanego oznacza budowę wszystkich jego elementow (toolchain, bootloader, jadro OS, główny system plików OS) Samodzielna realizacja tych zadań - roll your own (RYO) Zalety RYO: Całkowita kontrola oprogramowania Duża elastyczność (można zmusić system do robienia czegokolwiek!) Maksymalna redukcja zużywanych zasobów Wada RYO: trzeba być doświadczonym ekspertem! GUT Intel 2015/16 3/54
System automatycznej budowy oprogramowania SW Build system - automatyzacja procesu budowy oprogramowania SW buduje na podstawie kodu źródłowego wszystkie elementy oprogramowania Build system potrafi: Pobierać źródła ze wskazanej zewnętrznej lokalizacji Aktualizować kod źródłowy na podstawie łatek (patches) Budować różne elementy oprogramowania systemowego Tworzyć katalog główny i główny system plików Tworzyć pliki obrazów w różnych formatach GUT Intel 2015/16 4/54
Build system Inne przydatne funkcjonalności: Umożliwia tworzenie własnych pakietów Umożliwia wybór różnych profili systemu plików: dużego/małego, z obsługa grafiki lub bez, etc. Śledzi licencje open source wybranych przez użytkownika pakietów Posiada przyjazny interfejs użytkownika GUT Intel 2015/16 5/54
Build system Build system enkapsuluje składniki systemu jako pakiety (packages) - osobne dla maszyny hosta, osobne dla platformy docelowej Każdy pakiet jest zdefiniowany zbiorem zasad: jak pobrać kod źrodłowy jak go zbudować jak go zainstalować z bieżacej lokalizacji Między pakietami sa zależności. Build system: rozwiazuje te zależności buduje zbiór wymaganych pakietów GUT Intel 2015/16 6/54
Build systems Projekty open source: Buildroot: łatwy w użyciu system wykorzystujacy GNU make i Kconfig (http://buildroot.org) EmbToolkit: jedyny, który obsługuje LLVM/Clang (https://www.embtoolkit.org) OpenEmbedded: rozbudowane narzędzie, główny element Yocto Project (http://openembedded.org) OpenWrt: zorientowany na budowę firmware dla bezprzewodowych routerów (https://openwrt.org) GUT Intel 2015/16 7/54
Build systems Projekty open source: PTXdist: projekt sponsorowany przez firmę Pengutronix (http://www.pengutronix.de/software/ptxdist/index_en.html) Tizen: projekt dla urzadzeń mobilnych, audio-wideo, automatyki samochodowej (https://www.tizen.org) The Yocto Project: rozszerzenie OpenEmbedded; najpopularniejszy build system (http://www.yoctoproject.org) potrafi budować OS dla złożonych systemów wbudowanych każdy składnik budowany jest jako pakiet.rpm,.dpkg lub.ipk pakiety sa łaczone razem w obraz systemu plików umożliwia zbudowanie własnej dystrybucji Linuxa GUT Intel 2015/16 8/54
Formaty pakietów rpm (Red Hat Package Manager) - w Red Hat, Suse, Fedora i systemach pochodnych deb - (Debian package manager) - w systmach opartych na Debianie (Ubuntu, Mint) ipk (Itsy PacKage) - format oparty na deb dla systemów wbudowanych GUT Intel 2015/16 9/54
Buildroot Strona projektu: http://buildroot.org Dokumentacja: http://buildroot.org/docs.html Aktualna wersja systemu Buildroot obsługuje budowę wszystkich elementów systemu Podstawowe narzędzie: GNU make Historycznie pierwszy build system Poczatkowo - część projektów uclinux i uclibc do budowy małych systemów plików do testowania 2001-2006 - rozwijany jako niezależny projekt Od 2009 r. - dynamiczny rozwój (Peter Korsgaard) GUT Intel 2015/16 10/54
Buildroot Podstawowe zadanie to budowa obrazu głównego systemu plików (stad nazwa) potrafi również budować oprogramowanie rozruchowe i obraz jadra łatwy w instalacji i użyciu, szybko generuje obrazy Stabilna wersja Buildroot publikowana 4 razy w roku: w lutym, maju, sierpniu i listopadzie (nazwy oznaczone tagami: <year>.02, <year>.05, <year>.08, and <year>.11). Stabilne wersje sa rzadko aktualizowane po opublikowaniu GUT Intel 2015/16 11/54
Buildroot - instalacja Pobranie źródeł: Zawsze zaczynaj od dokumentacji. Dla Buildroot: rozdział System Requirement w The Buildroot User Manual (http://buildroot.org/downloads/manual/manual.html) Zainstaluj wymagane pakiety! GUT Intel 2015/16 12/54
Buildroot - configuring Buildroot używa Kconfig i Kbuild (narzędzia jadra OS) konfiguracja poprzez make menuconfig w configs/ około 90 konfiguracji przykładowych dla różnych platform i emulatora QEMU make help - lista platform docelowych buildroot optymalizuje wykorzystanie CPU (nie ustawia się opcji -j dla make) Przykład dla ARM dla QEMU: GUT Intel 2015/16 13/54
Buildroot - budowa Wynik: dwa nowe katalogi: dl/: archiwum źródeł output/: skompilowane pliki w katalogach: build/: lokalizacja budowy dla każdego elementu host/: narzędzia do uruchomienia elementów na maszynie hosta (np. toolchain w output/host/usr/bin) images/: obrazy (bootloader, jadro, system plików) staging/: link symboliczny sysroot dla toolchain target/: pośredni system plików - bez ustawionych opcji uprawnień do plików GUT Intel 2015/16 14/54
Buildroot - uruchomienie Przykład: uruchomienie emulatora QEMU z plikami dla ARM: login:root, brak hasła Zamknięcie QEMU - polecenie poweroff GUT Intel 2015/16 15/54
Emulator QEMU (Quick Emulator) Szybki emulator dostępny jako wolne oprogramowanie Autor: Fabrice Bellarda Umożliwia uruchomienie kilku systemów operacyjnych jednocześnie na jednej maszynie Tryby emulacji: użytkownika - może uruchamiać procesy systemu Linux skompilowane na innym typie procesora niż bieżacy. systemu - emulowany jest cały system, łacznie z różnymi urzadzeniami peryferyjnymi. GUT Intel 2015/16 16/54
Emulator QEMU (Quick Emulator) Niektóre zalety: szybkość możliwość uruchomienia oprogramowania Linuksa na innych platformach możliwość emulacji karty sieciowej pełna otwartość kodu możliwość zdalnej pracy na emulowanych maszynach za pomoca zintegrowanego serwera VNC obsługa przekierowań portów maszyny gospodarza na porty systemu gościa, pozwalajaca na uruchomienie wirtualnego serwera GUT Intel 2015/16 17/54
Yocto Project Yocto Project potrafi zbudować pojedyncze elementy systemu (toolchain, bootloader, jadro, główny system plików) cała dystrybucję Linuxa z binarnymi pakietami gotowymi do instalacji Składa się ze zbioru przepisów, napisanych jako skrypty Shell oraz Python BitBake - zarzadca zadań (task scheduler) - przetwarza przepisy i buduje komponenty OS Dokumentacja online: http://www.yoctoproject.org/. GUT Intel 2015/16 18/54
Yocto Project - historia (OpenEmbedded) Nazwa od prefiksu w układzie SI: 10-24 Korzenie Yocto Project - OpenEmbedded, http://openembedded.org/ OpenEmbedded (2003 r.) wyrósł na licznych projektach uruchamiania Linuxa na rożnych urzadzeniach przenośnych (Sharp Zaurus, Compaq ipaq) 2005 r. - Richard Purdie (OpenedHand) - projekt Poky OpenEmbedded i Poky - rozwijane niezależnie 2008 r. - Intel kupuje OpenedHand 2010 r. - Intel przenosi Poky Linux do Linux Foundation - Yocto Project od 2010 r. - wspólne składniki OpenEmbedded i Poky tworza wspólny projekt - OpenEmbedded core (oe-core) Rozwijany przez entuzjastów programowania Kompaktowy format pakietów:.ipk (ale też.rpm i.deb) GUT Intel 2015/16 19/54
Yocto Project - elementy Poky: domyślna dystrybucja Linux oe-core: metadane rdzenia (wspólne z OpenEmbedded) BitBake: zarzadca zadań (task scheduler) Documentation: dokumentacja każdego elementu Hob: graficzny interfejs użytkownika do OpenEmbedded i BitBake Toaster: interfejs web-owy do OpenEmbedded i BitBake ADT Eclipse: wtyczka Eclipse do wspierania budowy Yocto Project SDK GUT Intel 2015/16 20/54
Yocto Project Yocto Project może być używany sam lub rozszerzany za pomoca meta-warstw (meta layers) Wielu dostawców SoC dostarcza również board support packages (BSP) własnie poprzez meta-warstwy (np. Intel dla Intel Galileo) Meta-warstwy moga również służyć do budowania innych środowisk do generowania elementów OS: typu open-source (i.e. the Angstrom Project) komercyjnych (i.e. MontaVista Carrier Grade Edition, Mentor Embedded Linux, and Wind River Linux) GUT Intel 2015/16 21/54
Board Support Packages (BSP) BSP - Implementacja kodu specyficznego dla platformy sprzętowej, odpowiedniego dla konkretnego systemu operacyjnego 1981 - pierwsze użycie terminu BSP do opisania programu zależnego od sprzętu (hardware-dependent software) VRTX Używane przez firmę Wind River Systems do opisu elementów systemu VxWorks Inne firmy udostępniajace BSP: QNX Software Systems, Microsoft dla Windows CE, NVIDIA i inne Co robi BSP? Na przykład: inicjalizuje procesor, magistrale, kontroler przerwań, zegar, ustawienia RAM ładuje i uruchamia program rozruchowy z pamięci flash GUT Intel 2015/16 22/54
Yocto Project - wersje stabilne nowa wersja stabilna Yocto Project - raz na 6 miesięcy ( w kwietniu i w październiku) cztery ostatnie wersje: GUT Intel 2015/16 23/54
Środowisko pracy Stacja robocza (maszyna hosta) powinna spełniać następujace wymagania: system wieloprocesorowy symetryczny (symmetric multiprocessing,smp) co najmniej 8 GB pamięci, szybki dysk twardy szybkie łacze internetowe Wymagane oprogramowanie: OS Linux (jako system natywny lub wirtualny) Tar w wersji 1.24 lub wyższej Python w wersji 2.7.3 lub wyższej (ale nie Python 3) Instalacja wymaganych pakietów: $ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc- multilib build-essential chrpath socat libsdl1.2-dev xterm make xsltproc docbook-utils fop dblatex xmlto autoconf automake libtool libglib2.0-dev python-gtk2 bsdmainutils screen GUT Intel 2015/16 24/54
Yocto Project - konfiguracja Pobranie plików Yocto Project: $ git clone -b fido git://git.yoctoproject.org/poky.git Konfiguracja środowiska: $ cd poky $ source oe-init-build-env Utworzony zostanie bieżacy katalog roboczy build. Wybór innej nazwy katalogu roboczego: $ source oe-init-build-env build-qemuarm GUT Intel 2015/16 25/54
Yocto Project - konfiguracja Poczatkowo katalog roboczy zawiera tylko katalog conf, a w nim pliki konfiguracyjne: local.conf: specyfikacja platformy docelowej bblayers.conf: specyfikacja meta-warstw templateconf.cfg: lokalizacja przykładowych plików konfiguracyjnych (domyślnie meta-yocto/conf) Ustawienie maszyny docelowej w pliku local.conf: emulacja procesora arm: MACHINE?= "qemuarm" procesor quark: MACHINE?= "quark" GUT Intel 2015/16 26/54
Yocto Project - budowa Uruchomienie Bitbake z nazwa głównego systemu plików: core-image-minimal: mały system plików z obsługa konsoli; baza dla własnych konfiguracji core-image-minimal-initramfs: podobny do core-image-minimal, budowany jako ramdisk. core-image-x11: mały system plików z podstawowym wsparciem grafiki (serwer X11) core-image-sato: pełny system graficzny (oparty na środowisku SATO) Przykład: $ bitbake core-image-minimal GUT Intel 2015/16 27/54
Yocto Project - budowa obrazu Budowane lokalizacje i pliki: build/downloads - pobrane źródła, build/tmp - pliki pomocnicze work: główny katalog plików deploy: przygotowane pliki binarne (gotowe do uruchomienia): deploy/images/[machine name]: bootloader, jadro, główny system plików deploy/rpm: pakiety RPM deploy/licenses: pliki licencji (pochodza z wykorzystanych pakietów) GUT Intel 2015/16 28/54
Yocto Project - punkt widzenia użytkownika GUT Intel 2015/16 29/54
Yocto Project - warstwy Metadane zorganizowane sa w warstwy o nazwach rozpoczynajacych się od meta. Warstwa (layer) - grupa medanych definiujacych określona funkcjonalność Podstawowe warstwy Yocto Project: meta: OpenEmbedded core meta-yocto: Yocto Project core (dystrybucja OS Poky) meta-yocto-bsp: wybrane board support packages Lista warstw, które przetwarza BitBake: <your build directory>/conf/bblayers.conf GUT Intel 2015/16 30/54
Yocto Project - warstwy Dodatkowe warstwy opracowywane sa przez: producentów SoC, twórców Yocto Project, zwykłych pasjonatów Przydatna lista warstw: http://layers.openembedded.org GUT Intel 2015/16 31/54
Yocto Project - warstwy Przykład: zawartość bblayers.conf dla Intel Galileo GUT Intel 2015/16 32/54
Yocto Project - metadane BitBake przetwarza metadane różnego typu: recipes (.bb) - informacja o budowie jednostki oprogramowania: skad pobrać źródła? Jakie sa zależności? Jak zbudować i zainstalować komponent? append (.bbappend) - rozsrzerzenie przepisu; dołaczane do.bb o tej samej nazwie include (.inc) - informacja wspólna dla wielu przepisów. classes (.bbclass) - ogólne instrukcje budowy, np.: jak zbudować jadro? Klasy moga po sobie dziedziczyć, sa rozszerzane w przepisach oraz klasach dziedziczacych. Klasa classes/base.bbclass jest dziedziczona przez każdy przepis configuration (.conf) - definicje zmiennych konfiguracyjnych GUT Intel 2015/16 33/54
Yocto Project - funkcje w przepisach Przepis (recipe) - zbiór funkcji: ZADANIE OPIS FUNKCJA Fetch pobranie danych (źródeł) do_fetch() Unpack rozpakowanie danych do_unpack() Patch dodanie łatek (patch-ów) do_patch() Configure konfiguracja drzewa źrodeł do_configure() Compile kompilacja drzewa źródeł do_compile() Stage instalacja w przestrzeni stage do_stage() Install instalacja do_install() Package utworzenie pakietu do_package() GUT Intel 2015/16 34/54
Yocto Project - jak działa Bitbake Analiza przepisów (recipes) i plików konfiguracyjnych aby ustalić co i jak ma być zbudowane Pobranie z sieci kodu źródĺowego Budowa obrazu systemu GUT Intel 2015/16 35/54
Yocto Project - jak działa Bitbake Source: P. Raghavan, Amol Lad, Sriram Neelakandan, Embedded Linux system design and development GUT Intel 2015/16 36/54
Yocto Project - jak działa Bitbake BitBake analizuje konfigurację obrazu (m.in. pliki: bblayers.bb, local.conf) poszukujac dodatkowych warstw, klas, przepisów i zadań i budujac łańcuch zależności między nimi ( i standardowymi elementami OE-core). Rodzaje zależności: internally dependent, DEPENDS - zależności (pakiety) potrzebne w procesie budowania; RDEPENDS - zależności (pakiety) potrzebne w procesie wykonywania; inter-task dependent - set within a recipe and add a task before and/or after another task. GUT Intel 2015/16 37/54
Yocto Project - jak działa Bitbake Powstaje mapa ważonych priorytetów zadań (weighted task priority map). BitBake korzysta z tej mapy podczas ustalania kolejności budowy poszczególnych pakietów. Zadania wymagane przez większość innych zadań oceniane sa wyżej, a więc będa wykonane wcześniej podczas procesu budowy dystrybucji OS GUT Intel 2015/16 38/54
Yocto Project - jak działa Bitbake BitBake wykonuje kolejkę zadań (runqueue) rozdzielajac je między watki (maksymalna liczba watków zdefiniowana jest przez zmienna BB_NUMBER_THREADS w pliku conf/local.conf) Zadanie wykonywane podczas budowania pakietu może być modyfikowane za pomoca przepisu. Podstawowa, domyślna kolejność zadań rozpoczyna się od rozpakowania źródeł pakietów, konfiguracji i kompilacji skrośnej Skompilowane źródło jest rozdzielane na pakiety; tworzona jest debug package information. Rozdzielone pakiety pakowane s a do odpowiedniego formatu (rpm, ipk lub deb). Bitbake wykorzystuje je do budowy systemu plików. GUT Intel 2015/16 39/54
Yocto Project - jak działa Bitbake Źródło: www.denx.de/wiki/ GUT Intel 2015/16 40/54
Yocto Project - architektura (openembedded) GUT Intel 2015/16 41/54
BitBake - Interfejsy użytkownika podstawowy plik wykonawczy BitBake to bitbake/bin/bake W pierwszej kolejności uruchamiany jest interfejs użytkownika, który umożliwia: : prezentowanie wyników, statusie i postępach procesu budowania, przechwytywanie zdarzeń od zadań (build tasks). knotty - domyślny interfejs użytkownika; linia poleceń. hob - graficzny interfej użytkownika; umożliwia modyfikowanie plików konfiguracyjnych, dodawanie warstw i pakietów. GUT Intel 2015/16 42/54
BitBake - Hob GUT Intel 2015/16 43/54
BitBake - Hob GUT Intel 2015/16 44/54
BitBake - Hob GUT Intel 2015/16 45/54
Budowa Yocto dla Intel Galileo https://downloadcenter.intel.com/download/23197/intel-quark-bsp GUT Intel 2015/16 46/54
Budowa Yocto dla Intel Galileo GUT Intel 2015/16 47/54
Budowa Yocto dla Intel Galileo Zmiana gcc i g++ na starsze wersje (do 4.9)! http://askubuntu.com/questions/26498/choose-gcc-and-g-version GUT Intel 2015/16 48/54
Budowa Yocto dla Intel Galileo GUT Intel 2015/16 49/54
Budowa Yocto dla Intel Galileo GUT Intel 2015/16 50/54
Budowa Yocto dla Intel Galileo GUT Intel 2015/16 51/54
Budowa Yocto dla Intel Galileo oraz: libstd1.2-dev gcc-4.9-multilib patchutils GUT Intel 2015/16 52/54
Budowa Yocto dla Intel Galileo GUT Intel 2015/16 53/54
Budowa Yocto dla Intel Galileo GUT Intel 2015/16 54/54