Ładowanie systemu operacyjnego w urządzeniach wbudowanych

| Technika

Procesor umieszczony w systemie wbudowanym musi wykonać wiele czynności po włączeniu zasilania, aby użytkownik miał możliwość uruchomienia aplikacji. Cała procedura, choć może się wydawać prosta z teoretycznego punktu widzenia, staje się złożona, gdy trzeba spojrzeć na nią okiem projektantów odpowiedzialnych za kwestie sprzętowe oraz programowe. Poziom komplikacji wzrasta jeszcze bardziej, gdy pod uwagę brane są różnorodne konfiguracje sprzętowe, na jakich system operacyjny będzie uruchamiany z możliwością wyboru kilku opcji, jakie pozostawia się zazwyczaj użytkownikowi.

Ładowanie systemu operacyjnego w urządzeniach wbudowanych

U-Boot

Rys. 4. Do wykonania kodu umieszczonego w pamięci operacyjnej wymagana jest obecność pamięci nieulotnej, z której program może być pobrany i skopiowany do RAM

Można znaleźć wiele bootloaderów znajdujących zastosowanie w systemach wbudowanych (DINK32, Open Firmware, x86 bios), których zadaniem jest ładowanie systemu operacyjnego i przygotowanie procesora do pracy. Jedną z propozycji bootloadera z otwartym kodem źródłowym jest U-Boot (Universal Boot Loader), który jest popularny szczególnie w urządzeniach zawierających Linuksa.

U-Boot wspiera wiele platform sprzętowych, włączając w to najpopularniejsze: PPC, ARM, MIPS, AVR32, x86, 68k, Nios oraz MicroBlaze. Stanowi on szczególnie atrakcyjną propozycję, gdy potrzebny jest gotowe rozwiązanie pozwalające uniknąć pracy ze sprzętem na bardzo niskim poziomie. Zautomatyzowane, interaktywne środowisko oferuje szerokie możliwości konfiguracji procesu ładowania systemu operacyjnego i wspiera przy tym szereg interfejsów komunikacyjnych, takich jak: USB, SATA, PCIe lub z kart pamięci SD.

System może zostać załadowany także za pośrednictwem sieci Ethernet, gdyż U-Boot potrafizainicjować otoczenie sieciowe, skopiować obraz systemu i przekazać kontrolę do jądra. Kod wynikowy U-Boota można umieścić zarówno w pamięci ROM, jak i Flash. Po zakończeniu inicjacji CPU, pamięci oraz magistral bootloader przekopiuje swój kod do pamięci operacyjnej i stamtąd będzie kontynuował uruchamianie systemu.

Ponadto U-Boot uruchamia podprogram pozwalający użytkownikowi poprzez port szeregowy wpływać na proces ładowania systemu operacyjnego. Projektant może również skonfigurować bootloader tak, aby pracował w sposób autonomiczny, bez ingerencji ze strony użytkownika. W oknie terminala wyświetlane są informacje pokazujące przebieg ładowania systemu.

U-Boot obsługuje szeroki zakres poleceń, które mogą być wywoływane z interaktywnego okna komend. Oprócz tych związanych z uruchamianiem systemu operacyjnego dostępne są również polecenia pozwalające zrealizować przydatne zadania, takie jak zapisywanie i odczyt pamięci operacyjnej, kasowanie, programowanie oraz odczytywanie zewnętrznych pamięci.

U-Boot jest skalowalny, co pozwala dostosować go do potrzeb aplikacji. Warto mieć na uwadze, że zajmowana przez ten bootloader pamięć jest proporcjonalna do liczby interfejsów, z których docelowe urządzenie ma umożliwiać załadowanie systemu operacyjnego. Struktura katalogów, w jakich umieszczone są kody źródłowe, jest zgodna z ogólnie znanymi regułami, co pozwoli łatwiej rozeznać się w strukturze kodu i wprowadzić sprawniej ewentualne poprawki.

Przystosowanie bootloadera do potrzeb nowej platformy sprzętowej najczęściej sprowadzi się jedynie do modyfikacji kilku plików związanych bezpośrednio z CPU, układami peryferyjnymi czy bibliotekami pisanymi pod specyficzne potrzeby danego układu. Otwartość kodu, skalowalność i spora liczba wspieranych interfejsów sprawiają, że U-Boot jest bootloaderem wartym wzięcia pod uwagę, gdy projektowane urządzenie będzie pracowało pod kontrolą systemu Linux.

NAND Flash kontra NOR Flash

Rys. 5. Budowa wewnętrzna komórek pamięci Flash typu NAND oraz NOR

Na rynku spotyka się zasadniczo dwa typy pamięci Flash: NAND oraz NOR. Podstawowa różnica do tyczy sposobu organizacji wewnętrznych komórek pamięci. W przypadku pamięci NAND poszczególne komórki pamięci są dużo mniejsze i połączone szeregowo, podczas gdy w układach NOR komórki są łączone równolegle i z tego względu mają większe rozmiary - rysunek 5.

Taka struktura diametralnie wpływa na właściwości obu typów pamięci. Pierwszym oczywistym rezultatem jest pojemność. Ze względu na mniejsze wymiary pojedynczych komórek pamięci to właśnie pamięci wykonane w technologii NAND cechują się znacząco większą pojemnością. Bezpośrednim tego następstwem jest niższy koszt pojedynczego bitu.

Równoległe połączenie zapewnia bezpośredni dostęp do każdej komórki, więc łatwo zauważyć, że odczyt danych w pamięciach NOR będzie kilkukrotnie szybszy, choć czas zapisu ulegnie znaczącemu wydłużeniu. Każdy typ pamięci ma swój obszar zastosowań. Pamięci NAND Flash są zdolne magazynować duże ilości danych, oferując atrakcyjną cenę, więc są wykorzystywane w aparatach fotograficznych, przenośnych pamięciach, smartfonach itd.

Układy NOR Flash, oferując szybki odczyt danych i bezpośredni dostęp do każdej komórki, nadają się m.in. do przechowywania programu wykonywanego przez procesor. Ze względu jednak na wyższą cenę pamięci NAND Flash zaczynają być brane pod uwagę jako alternatywa, z której program jest kopiowany najpierw do pamięci operacyjnej, a dopiero później wykonywany.

Podsumowanie

Uruchamianie systemu operacyjnego nie jest zadaniem trywialnym, gdyż konieczna jest współpraca oprogramowania oraz części sprzętowej. Obecnie projektanci mają możliwość skorzystania z wielu gotowych rozwiązań, zarówno w zakresie wyboru bootloadere, jak i systemu operacyjnego.

Nie bez znaczenia jest również dostępność szerokiej gamy interfejsów, przez jakie system może zostać załadowany. Pozwala to na dobranie rozwiązania najlepiej sprawdzającego się w konkretnej aplikacji pod względem rozmiarów, ceny, komplikacji płytki drukowanej czy wygody stosowania.

Jakub Borzdyński