wersja mobilna
Online: 677 Piątek, 2017.12.15

Technika

Ładowanie systemu operacyjnego w urządzeniach wbudowanych

piątek, 22 lutego 2013 12:59

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.

Spis treści » Ładowanie systemu Windows XP
» Resetowanie i konfiguracja systemów wbudowanych
» Elementy pierwszego i drugiego stopnia
» U-Boot
» Podsumowanie
» Pokaż wszystko

Przykład stanowi system Windows, który jest uruchamiany na bardzo różnorodnym sprzęcie, pochodzącym od różnych producentów i wyprodukowanym na przestrzeni wielu lat. Użytkownik może ponadto wpływać na sposób ładowania systemu operacyjnego, wskazując choćby lokalizację właściwych plików: dysk twardy, napęd optyczny, pamięć masowa czy niekiedy interfejs taki jak Ethernet.

Załadowanie systemu operacyjnego sprowadza się do umieszczenia programu w pamięci RAM, z której będzie on następnie wykonywany. Typowy scenariusz zakłada przekopiowanie obrazu z pamięci nieulotnej (dysk twardy, pamięć Flash) do pamięci operacyjnej, gdyż z reguły jest ona znacząco szybsza.

Pierwszy etap rozpoczyna się po włączeniu zasilania bądź resecie i sprowadza się do przygotowania części sprzętowej, na co składa się inicjacja układów peryferyjnych. Przykład może stanowić rodzina procesorów i.MX, która po resecie sprawdza stany logiczne na określonych wejściach, aby wybrać tryb uruchomienia. Inicjowane układy peryferyjne są niezbędne na etapie ładowania systemu.

Na przestrzeni ostatnich lat dokonał się znaczący postęp, wzrosły możliwości współczesnych procesorów i systemów wbudowanych, a co za tym idzie proces uruchamiania systemu operacyjnego też stał się znacząco bardziej skomplikowany. Oczywistą zaletą takiej sytuacji jest możliwość uruchomienia systemu operacyjnego już nie tylko z dysku twardego, ale można go załadować z szerokiej gamy nośników (chipów pamięci Flash, kart SD, przenośnych pamięci masowych USB).

Ponadto współczesne bootloadery umożliwiają ładowanie systemu operacyjnego za pośrednictwem popularnych interfejsów: UART, SATA, PCIe, Ethernet. Możliwość ładowania systemu (lub jego instalowania) za pośrednictwem pamięci masowych zapewnia oprócz wygody także szereg korzyści.

Przykład może stanowić instalowanie oprogramowania w netbookach, dzięki czemu nie muszą one mieć napędu optycznego, który nie należy do szczególnie praktycznych i niepotrzebnie zwiększałby rozmiary urządzenia. Innym zastosowaniem jest serwisowanie urządzeń z uszkodzonym firmware'em.

Serwis ma możliwość uruchomienia narzędzi diagnostycznych i zapisania nowego oprogramowania bezpośrednio z pamięci masowej. Unika się tym samym odsyłania uszkodzonego sprzętu do producenta posiadającego stosowny programator, co przyczynia się do zmniejszenia kosztów naprawy i transportu.

Procesory bardziej zaawansowane potrafią załadować system operacyjny pobrany z innych, mniej typowych źródeł, czego przykład stanowi złącze PCIe, karty SDHC, konwencjonalne (równoległe) pamięci nieulotne Flash czy USB. Urządzenie musi być jednak wyposażone w bootloader zdolny pobrać kod z wybranego źródła i umieścić go w pamięci. Przykład może stanowić U-boot dostępny wraz z otwartym kodem źródłowym znajdujący zastosowanie w systemach wbudowanych.


Ładowanie systemu Windows XP

Rys. 1. Zestaw czynności wykonywanych podczas ładowania systemu systemu Windows XP

Typowy scenariusz ładowania systemu operacyjnego pokazano na rysunku 1. Wykorzystuje go m.in. Windows XP. Po włączeniu zasilania (bądź resecie) procesor pozostaje nieaktywny do momentu ustabilizowania się napięcia zasilającego - w tym czasie wewnętrzny reset jest utrzymywany w stanie aktywnym. Po zapewnieniu właściwego zasilania rozpoczyna się wykonywanie programu pobranego z pamięci ROM.

W przypadku komputerów PC będzie to BIOS, który w pierwszej kolejności przeprowadza test POST (power-on self-test). Ocenie podlega poprawność funkcjonowania podstawowych modułów sprzętowych. Wykryte na tym etapie błędy są sygnalizowane akustycznie, gdyż karta graficzna jest inicjowana dopiero w następnym kroku.

BIOS wyszukuje układ graficzny poprzez skanowanie przestrzeni adresowej w zakresie od C000:0000 do C780:0000. W efekcie nastąpi zainicjowanie i przetestowanie każdej odnalezionej karty graficznej, potencjalnie od razu z pamięcią wideo i odczyt informacji o dostępnych monitorach. Warto zauważyć, że "zimny" reset wymusza przeprowadzenie pełnego testu od początku, podczas gdy "ciepły" pozwala pominąć część czynności sprawdzających poprawność pracy podzespołów.

W dalszej części procesu ładowania systemu operacyjnego odczytywane są dane konfiguracyjne umieszczone w pamięci, której zawartość jest podtrzymywana przez niewielką baterię litową. Pamięć ta przechowuje m.in. aktualną godzinę, datę oraz ustaloną kolejność przeszukiwania dysków i interfejsów pod kątem obecności systemu operacyjnego.

BIOS, mając do czynienia z dyskiem twardym, analizuje pierwszy sektor w poszukiwaniu MBR (Master Boot Record) zawierającego informacje o strukturze logicznej dysku (tablica partycji), umiejscowieniu aktywnej partycji oraz zawierającego program niezbędny do kontynuowania pracy. Po odnalezieniu aktywnej partycji następuje sprawdzenie sygnatury w jej pierwszym sektorze, gdy będzie ona właściwa, nastąpi wykonanie kodu znajdującego się w sektorze rozruchowym.

Z systemem Windows XP związany jest program rozruchowy NT OS Loader (NTLDR, New Technology Loader) wczytywany do pamięci przez program umieszczony w sektorze rozruchowym. NTLDR znajduje się w głównym katalogu partycji systemowej i do jego zadań należy m.in. przełączenie procesora w tryb chroniony, aktywacja 32-bitowego dostępu do pamięci, włączenie stronicowania pamięci.

Ładowany jest ponadto sterownik dający dostęp do plików zapisanych na partycjach FAT16, FAT32 oraz NTFS. Wyszukiwany jest plik hiberfil.sys tworzony podczas hibernacji systemu, jeżeli jest on obecny, następuje odtworzenie zawartości pamięci z załadowanym uprzednio systemem Windows. W przypadku braku tego pliku załadowany zostanie "czysty" system operacyjny.

NTLDR może wykryć obecność więcej niż jednego systemu operacyjnego, w takiej sytuacji wstrzyma swoją pracę i wyświetli menu umożliwiające wybór systemu, jaki ma zostać uruchomiony. Kolejnym krokiem jest uruchomienie kodu odpowiedzialnego za gromadzenie podstawowych informacji o podzespołach komputera.

Po uzyskaniu informacji o konfiguracji sprzętu następuje dalszy etap uruchamiania - ładowane są pliki jądra systemu oraz sterowniki systemowe. Na tym etapie wyświetlane jest logo systemu oraz pasek postępu informujący użytkownika o trwającym procesie. Ładowane są także sterowniki pominięte przez NTLDR.

Ostatnim krokiem będzie uruchomienie menedżera sesji odpowiedzialnego za utworzenie przestrzeni użytkownika i załadowanie sterowników urządzeń wykorzystujących podsystem graficzny. Proces uruchamiania systemu Windows XP kończy się, gdy zaloguje się użytkownik.

Procesory z rodziny i.MX

Przykładem obrazującym stopień złożoności współczesnych procesorów w zakresie ładowania systemu operacyjnego jest rodzina procesorów i.MX51 Freescale. Ma ona wbudowaną pamięć ROM, z której pobierany jest bootloader odpowiedzialny za inicjację poszczególnych modułów procesora (m.in. centralnej jednostki bezpieczeństwa CSU, interfejsu pamięci zewnętrznych EMI, kontrolera eSDHC, I²C, pętli PLL, portu szeregowego czy watchdoga).

Ponadto odczytuje on bity (eFUSE) lub wejścia konfiguracyjne, w zależności od wybranego trybu, aby na tej podstawie określić sposób, w jaki ma przebiegać ładowanie systemu. Warto zauważyć, że układy i.MX51 wspierają mechanizmy bezpieczeństwa oparte na kluczu publicznym i prywatnym. Oznacza to, że projektanci mogą wykluczyć uruchamianie nieautoryzowanego (niepodpisanego prywatnym kluczem) kodu.

Procesor może zostać ustawiony tak, aby nie ładował z pamięci ROM bootloadera i od razu przystąpił do pobierania systemu z pamięci zewnętrznej. Warto wspomnieć o obecności trybu serial downloader, który umożliwia załadowanie i wykonanie programu przez port szeregowy bądź USB.

Przesłany w ten sposób program jest umieszczany w pamięci RAM, skąd następuje jego wykonanie i może on posłużyć do programowania zewnętrznej pamięci Flash. System ładowany przez bootloader może znajdować się na nośnikach takich jak karty pamięci MMC/SD, standardowe pamięci Flash czy pamięci szeregowe z dostępem przez interfejs szeregowy I²C (EEPROM) lub SPI (Flash).



Resetowanie i konfiguracja systemów wbudowanych

Rys. 2. Ładowanie domyślnych wartości do rejestrów po resecie jest najpopularniejszym sposobem wstępnej inicjacji systemu

W prostych procesorach i większości mikrokontrolerów reset powoduje przywrócenie zawsze tych samych ustawień, zdefiniowanych przez producenta lub częściowo przez projektantów, np. za pomocą specjalnie przewidzianych do tego celu bitów konfiguracyjnych. W efekcie, po zakończeniu zerowania układu częstotliwość taktowania, adresy początkowe, ustawienia portów I/O, konfiguracja zewnętrznych interfejsów pamięci czy stan poszczególnych układów peryferyjnych będą z góry określone i znane.

Wadą takiego podejścia jest konieczność każdorazowego konfigurowania CPU i zapisywania niekiedy sporej liczby rejestrów, aby układ był gotowy do pracy zgodnie z wymaganiami aplikacji, w jakiej został umieszczony. Załadowanie domyślnych wartości po resecie jest najbardziej typowym i najczęściej spotykanym scenariuszem, który nie wymaga żadnych dodatkowych zabiegów ze strony projektantów.

Bardziej złożone procesory dysponują nieporównywalnie większą liczbą rejestrów, których każdorazowe konfigurowanie nie zawsze jest akceptowalne i wygodne. Ponadto może zachodzić konieczność skonfigurowania procesora zanim rozpocznie się wykonanie właściwego programu. Sytuacja taka ma miejsce, gdy kod jest pobierany z interfejsów wymagających wstępnej konfiguracji (np. port szeregowy czy karta pamięci).

W związku z tym powstał szereg rozwiązań wspierających wstępną konfigurację procesora przed zakończeniem resetowania. Jednym z najprostszych i najbardziej intuicyjnych sposobów zapisania wstępnej konfiguracji jest sprawdzenie stanu określonych wejść i załadowanie wybranego w ten sposób zestawu wartości początkowych.

Wejścia te są wewnętrznie podciągane do plusa zasilania lub masy i ich domyślny stan można zmienić wymuszając zewnętrznie inny stan logiczny. Po włączeniu zasilania podawany jest sygnał resetu (Power on Reset), po zaniku którego następuje odczyt stanów wejść konfiguracyjnych i rozpoczyna się ładowanie określonego zestawu wartości początkowych do rejestrów.

Do momentu zakończenia fazy ładowania wartości początkowy aktywny jest wewnętrzny sygnał resetu, który wstrzymuje pracę procesora. Jest on zwalniany dopiero po załadowaniu wartości początkowych (rys. 2). Rozwiązania tego typu zapewniają pewną elastyczność niezbędną do wyboru np. interfejsu, z jakiego ma zostać pobrany program do załadowania.

Wadą podejścia opartego na wejściach konfiguracyjnych jest ograniczona elastyczność - załadowany może być tylko jeden, ściśle określony zestaw wartości początkowych z odgórnie dostępnej puli. Tym samym projektant jest zmuszony korzystać ze scenariuszy przygotowanych przez producenta i nie może np. zmieniać dowolnie prędkości portu szeregowego.

Niemniej wady te przekładają się na szybszą inicjację i skrócenie czasu oczekiwania na gotowość procesora do pracy. Procesory wyposażone w wejścia konfiguracyjne mogą współpracować z buforami trójstanowymi takimi jak 74LVC125 - rysunek 3. Wejście enable jest aktywowane sygnałem resetu, zadając ustalone stany na czas odczytu konfiguracji z wyprowadzeń.

Zapewniony w ten sposób wpływ na proces konfiguracji daje możliwość wykorzystania układów peryferyjnych współdzielących porty z wejściami konfiguracyjnymi. Użytkownik często ma dostęp do przełącznika typu DIP switch pozwalającego wymusić pożądane stany logiczne. Tym samym pozostawia się możliwość wpływania na stan procesora po resecie z funkcją np. wskazania skąd ma być załadowany system operacyjny.

Niektóre procesory zapewniają znacznie większą elastyczność na etapie konfiguracji, umożliwiając projektantom określenie wartości ładowanych do rejestrów po resecie. Do tego celu wykorzystywane są pamięci nieulotne lub specjalizowane bity bezpieczników (fuse). Po resecie odczytywane są z nich wartości i służą one do inicjacji procesora.

Warto mieć na uwadze, że programowanie bitów bezpieczników można niekiedy zrealizować tylko raz, zazwyczaj poprzez specjalnie przygotowaną do tego celu procedurę (programową bądź sprzętową). Programowalne bity bezpieczników, oprócz wprowadzenia pewnej elastyczności w proces konfiguracji procesora, pozwalają producentom niekiedy parametryzować sprzedawane podzespoły.

Przy zachowaniu odpowiednich zabezpieczeń układy danej rodziny mogą być wytwarzane w jednym procesie technologicznym, a o ich końcowych funkcjach zdecyduje właśnie odpowiednie zaprogramowanie tych bitów. Oznacza to, że tańszy procesor nie różni się od strony fizycznej niczym od droższego, a jedynie producent inaczej zaprogramował bity bezpieczników, zapewniając tym samym dostęp do większych zasobów.

Podejście tego typu nie budzi raczej dużego zdziwienia ze względu na wszechobecną presję na redukcję niepotrzebnych kosztów. Znacznie bardziej ekonomiczna jest produkcja jednego rodzaj układu i parametryzowanie go bitami bezpieczników, niż przygotowanie niezależnych procesów produkcyjnych i narzędzi testowych dla każdego egzemplarza danej rodziny procesorów.

Innym, dającym szerokie możliwości, sposobem konfiguracji procesora jest odczyt z zewnętrznej pamięci wartości początkowych dla poszczególnych rejestrów. Jest to szczególnie korzystne, gdy projektanci potrzebują możliwości indywidualnego dostosowania procesora do potrzeb aplikacji już na etapie resetowania, a liczba dostępnych wyprowadzeń konfiguracyjnych jest ograniczona i nie ma możliwości przeznaczenia kilkunastu wejść na ten cel.

W typowym przypadku wartości rejestrów są odczytywane z pamięci przez port SPI i są zapisywane do właściwych rejestrów. Dodatkową korzyścią jest uproszczenie płytki drukowanej, a pamięć szeregowa może przy okazji przechowywać dodatkowe rzeczy, takie jak kod bootloadera.


Elementy pierwszego i drugiego stopnia

Rys. 3. Wybór konfiguracji początkowej procesora może być realizowany w oparciu o wejścia konfiguracyjne i bufor trójstanowy

Uruchamianie systemu operacyjnego jest nierozerwalnie związane z pamięciami oraz interfejsami, z których pobierany jest kod. Rozróżnia się tu urządzenia pierwszego (primary) oraz drugiego stopnia (secondary). Przynależność do jednej z tych dwóch grup jest determinowana przez możliwość podjęcia pracy natychmiast po zakończeniu fazy resetu i związanej z nią konfiguracji procesora.

Elementy pierwszego stopnia umożliwiają natychmiastowy odczyt programu bez konieczności inicjacji urządzenia. Przykład może stanowić pamięć ROM, niekiedy zintegrowana w jednej obudowie z procesorem, z której pobierane są instrukcje po zakończeniu fazy resetu. Pobrany stąd i wykonany program przygotowuje do pracy urządzenia drugiego stopnia takie jak pamięć RAM, w której znajdzie się obraz systemu operacyjnego załadowany przez bootloader.

Pamięć ulotna (RAM) jest pamięcią drugiego stopnia, bo po włączeniu zasilania nie zawiera ona żadnego programu - musi on zostać tam uprzednio wczytany. Dopiero po zakończeniu kopiowania następuje przekazanie kontroli i wykonywanie programu z pamięci operacyjnej. Wykonywanie programu znajdującego się w RAM pozwala zwiększyć szybkość wykonywania instrukcji oraz ograniczyć zużycie energii.

Jeszcze lepsze rezultaty osiąga się, gdy stan pamięci zostaje zachowany po utracie zasilania z głównego źródła i może korzystać z zasilania awaryjnego. Wznowienie pracy nie będzie wymagało ponownego kopiowania programu do pamięci, co dodatkowo skróci czas oczekiwania na powrót urządzenia do stanu gotowości.

Współcześnie komputery PC, laptopy, smartfony oraz bardziej złożone systemy wbudowane powszechnie wykorzystują pamięci DDR SDRAM. Stanowią one niezbędny element wszędzie tam, gdzie przetwarzana są duże ilości danych, szczególnie multimedialnych. Odczyt i wykonanie programu oraz dostęp do danych odbywa się ze znacznie większą prędkością niż w klasycznych systemach wyposażonych w pamięci Flash lub SRAM.

Typową architekturę urządzenia wykonującego program pobierany z pamięci operacyjnej przedstawiono na rysunku 4. W pierwszym kroku uruchamiany jest bootloader zlokalizowany w pamięci ROM odpowiedzialny za inicjację kontrolera pamięci i skopiowanie zawartości Flash do pamięci RAM. Po zakończeniu tego etapu następuje skok pod adres zlokalizowany w przestrzeni pamięci operacyjnej, skąd pobierane będą dalsze instrukcje procesora.

Bootloader może odpowiadać za konfigurację układów peryferyjnych, aby umożliwić załadowanie docelowego programu lub systemu operacyjnego za pośrednictwem jednego z wielu dostępnych interfejsów, takich jak interfejs kart pamięci SD, pamięci Flash, Ethernet czy USB. Niekiedy bootloader znajdujący się w pamięci ROM umożliwia przywrócenie skasowanego bądź uszkodzonego systemu operacyjnego.

Najszybszy start systemu operacyjnego zapewnia pobieranie obrazu systemu przez interfejs współpracujący z zewnętrznymi pamięciami takimi jak NOR Flash. Dużą szybkość zapewnia równoległa magistrala o szerokości nawet 32 bitów, pracująca z wysoką częstotliwością. Rozwiązanie tego typu jest szczególnie korzystne, gdy ładowany system operacyjny ma duży rozmiar - przepustowość magistrali przekłada się bezpośrednio na czas oczekiwania na zakończenie kopiowania danych do pamięci.

W typowym przypadku może się on zawierać w granicach od kilku do kilkudziesięciu sekund. Pamięci NAND Flash zyskują na popularności, jednakże ich szybkość odczytu nadal jest odczuwalnie niższa niż dla NOR Flash. W ostatnich lata zwiększyła się jednakże liczba układów pozwalających ładować system z pamięci NAND Flash i traktować je jako pamięci pierwszego stopnia.

Konieczny jest do tego sprzętowy kontroler, który może w typowym przypadku wymagać podłączenia ponad dwudziestu wyprowadzeń do pamięci, przez co nie zawsze jest najbardziej pożądanym rozwiązaniem. Warto zauważyć, że producenci wyposażają swoje procesory w coraz większą liczbę sprzętowych kontrolerów, co pozwala wybrać najbardziej optymalne rozwiązanie dla potrzeb pobierania kodu systemu operacyjnego (SDHC, SPI, I²C, SATA, PCIe, USB, pamięci z interfejsem szeregowym itd.).

Wykorzystanie zewnętrznych, szeregowych pamięci do przechowania systemu operacyjnego jest korzystne w układach bazujących na procesorach z ograniczoną liczbą wyprowadzeń, a wydłużony czas uruchomienia systemu nie stanowi problemu bądź system ma niewielki rozmiar.

Schemat bootowania jest w takim przypadku zbliżony i sprowadza się do przekopiowania kodu przez wybrany interfejs do pamięci RAM, skąd jest następnie wykonywany.



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