Boot-loader Av Carl Wernstedt 02-09-25 da99cwt@ing.umu.se
Inledning All hårdvara som använder sig av något slags operativsystem behöver en boot-loader för att kunna starta och lägga in önskat operativsystem, samt någon anordning för att kunna ladda in själva boot-loader programmet. Det här kapitlet tittar närmare på olika Linux boot-loaders för Intel StrongARM processorer, deras olika egenskaper samt visar hur man installerar en boot-loader och laddar ner filsystem / kärna till LART systemet.
Boot-loaderns huvud uppgifter 4 Boot-loaderns uppgifter i detalj 5 Olika bootloaders 6 ABLE 6 Angel/AngelBoot 6 Blob (Boot Loader OBject) 6 Bootldr 6 Jflash 6 Hermit 7 NeTTrom 7 Blob Praktiskt exempel 8 BLOB i pseudokod 10 Referenser 13
Boot-loaderns huvud uppgifter Det finns idag många olika Linux boot-loaders, många är under utveckling och deras funktioner ändras hela tiden men samtliga tillhandahåller stöd för de mest fundamentala uppgifter som en boot-loader skall utföra. För att kunna använda Linux som operativsystem krävs två saker av boot-loadern. 1) Boot-loadern måste ladda upp Linux kärnan till minnet. 2) Boot-loadern måste ladda upp ett rot filsystem till minnet. Givetvis måste även andra uppgifter utföras men dessa två är de viktigaste. De flesta boot-loaders har två lägen de kan användas i, Bootloading och Downloading. Bootloading innebär att boot-loadern opererar självständigt och laddar ner sin kärna och filsystem från en intern enhet, det vill säga en normal boot-loader procedur. Downloading innebär att boot-loadern arbetar samt laddar ner kärna och filsystem från en extern enhet, det här läget används oftast för att installera kärnor / filsystem samt för att uppdatera dessa. Förutom dessa uppgifter gör boot-loadern mycket mera, i StrongARM fallen körs operativsystemet från RAM, men innan boot-loadern kan lämna över ansvaret till kärnar gör den följande saker. 1) Initialiserar standard hårdvara som att sätta CPU hastighet, minnes hantering, avbrott samt att bestämma storlek på ram minnet. 2) Initierar de enheter som behövs för att läsa kärnans och filsystemets image-filer. 3) Ordna plats i det fysiska minnet för kärna och filsystem, lägga in dessa på respektive plats samt anropa kärnan med lämpliga parametrar. Därefter har boot-loadern fyllt sin funktion och ansvaret kan överlämnas till kärnans startupp sekvens. Givetvis är det även en rad andra saker som händer än de 3 stegen som ovan är beskrivet.
Boot-loaderns uppgifter i detalj När boot-loadern körs brukar den vanligtvis initiera enheter som tillexempel en seriell UART och någon GPIO för att kunna kommunicera. GPIOn är vanligtvis kopplad till en lysdiod för att kunna visa sin status och eventuella felmeddelanden. Den seriella överföringen används för att skicka ut status samt ta in boot-loader kommandon, om inte boot-loadern själv kommer att använda sig av dessa funktioner behöver den inte initiera dessa efter som kärnan själv kommer att göra det vid uppstart. Boot-loaderns uppgift att ta reda på minnesstorleken kan anses lite onödig då det kan hårdkodas in i kärnan, men är lämpligt för enheter där minnes mängden kan variera. För att kunna anropa kärnan med parametrar krävs att boot-loadern och kärnan kommer överens om en fysik minnesadress där informationen läggs och läses, för StrongArm processorn ligger adressen på 0xc0000100 dvs. 256 från botten av det fysiska minnet. En annan aspekt som bootloadern måste ta hänsyn till är var kärnan skall placeras, vanligtvis läggs kärnan längst ned i minnet men behöver här läggas en bit ovanför (0x8000). Det utrymmet som skapas mellan kärnan och slutet på minnet används av kärnans page tabeller. Om minnet ligger på adressen 0xc0000000 laddas kärnan på 0xc000800000. Filstrukturen laddas vanligtvis 8MB ovanför på adressen 0xc900000. Det som avgör dessa värden är att Kärnans och RAMdiskens image filer inte skall överlappa med den uppackade kärnan. När kärnan väl är uppackad tas den packade versionen bort för att frigöra minne till andra användnings områden. Slutligen måste boot-loadern beakta viloläge (sleepmode). När ARM processorn utför en reset, exekverar den instruktioner på minnes adressen 0, där boot-loadern ligger. Detta sker även när processorn vaknar från viloläge. För att inte boot-loadern omedelbart skall utföra en reset måste den kolla lämpliga statusregister för att se om processorn vill ha en omstart eller bara vaknar från viloläge, då den ska utför en annorlunda procedur. För StrongARM SA-11x0 processorer innebär detta att Reset Controller Status Register (RCSR) kollas för att se vilken typ av reset som har utförts. Om det var en väcknings signal hämtar den ett värde från Power Manager Scratchpad Rigister (PSPR), boot-loadern använder det hämtade värdet för att komma till rätt adress i väckningskoden.
Olika bootloaders Det finns än uppsjö av olika bootloaders på marknaden som ständigt förändras men här visas några av de populäraste. ABLE Boot-loader skriven av Ben Dooks och Vince Sanders, stödjer Riscstation och Simtec a7500fe plattformar baserade på ARM7500FE enheter. Boot-loadern lagras i ROM alternativt i ett EEPROM, laddar images från en IDE disk partition. Ner laddningen sköt via ett seriellt interface. Angel/AngelBoot Stödjer Intel StrongARM SA-1110 processorer samt dess utvecklingsbord, målfilerna sparas i flashminne och skickas över seriellt. Under bootsekvens laddas kärnan och ramdisken till RAM innan ansvaret läggs över på kärnan. Angel är själva koden som hanterar den enhet som startas upp och AngelBoot är det program som körs för att hantera uppladdning. Tillsammans utgör de en enkel och effektiv bootloader. Blob (Boot Loader OBject) Blob var ursprungligen skriven för LART av Erik Mouw och Jan-Derk Bakker, men finns nu för andra Intel StrongARM SA-1110 baserade plattformar. Blob ligger i enhetens lokala eller utbyggda flashminne., varifrån den kan ladda samt spara kärna och filsystem. Operationerna sker via ett seriellt interface där uppladdningen sker i form av UUkodade filer. Under normal uppstart initieras hårdvaran och kärnan samt RAMdisk läggs över från flash minnet till RAM. Ett utförligt exempel hur blob fungerar visas senare i texten. Bootldr En fullfjädrad bootloader som främst är känd för att sitta i Compaq's ipaq. Utöver ipaqen används Bootldr till StrongARM SA-1110, Skiff, HP Journade 720 samt en del andra mindre projekt. Parametrar för kärna och uppstart finns sparat i flash minne tillsammans med kärnan och filsystem (vanligtvis JFFS2 men stöd finns även för RAMdisk och CRAMFS). Bootldr har ungefär 30 kommandon för att dela upp och styra flashminne, samt inbyggt stöd för att visa en startbild på ipaqn där användaren kan styra olika moment genom GPIOs. Uppladdningar sker via seriellt Xmodem. Jflash Jflash är från början ett Windows baserat program men har senare portats till Linux av Nico Pitre. Boot-loadern tillhanda håller de vanligaste funktionerna och finns till LART och TuxScreen båda är StrongARM SA-1110 plattformar.
Hermit En ganska enkel boot-loader med stöd för Ethernet kommunikation som använder sig av sockets istället för TCP/IP stack. Efter som ingen kollisionsdetektering utförs rekommenderas en korskopplad kabel alternativt en hub utan andra enheter inkopplade. NeTTrom NeTTrom är egentligen en väldigt nedbantad version av Linux kärnan med inbyggt stöd för hårddisk och nätverk. Boot-loadern ligger i ROM och nedladdning sker via en IDE disk alternativt nätverksanslutning då den använder sig av DHCP och TFTP. Nackdelen är att den tar relativt stor plats, omkring 500K.
Blob Praktiskt exempel Låt oss säga att vi har något system baserat på StrongARM SA-1110 processorn, LART systemet tillexempel. Det enklaste sättet att installera Blob är att ta hem en färdig kompilerad version från till exempelvis ftp.netwinder.org/users/c/chagas. Paketet heter blob-kit-assabet-1.3.tar.gz och innehåller dels Bloben samt verktyg för att installera den. På sin värddator packar man upp filen genom att skriva: %tar xzvf blob-kit-assabet-1.3.tar.gz %cd blob-kit %-/Jflash-linux blob-linux Förhoppningsvis har man anslutit sin lart till serieport 1 eftersom verktygen är inställda på det. Det som händer nu är att Blob läggs in på LARTens flashminne. När väl det är gjort startar man upp valfritt terminal program, tillexempel minicom. Konfigurerar serieporten att använda hastigheten 9600 bps 8-N-1. Starta sedan om LARTen genom att göra en reset alternativt slå av och på strömförsörjningen. Följande meddelande skall då visas i terminal fönstret. Blob version 1.0.8-pre2, Copyright (C) 1999 2000 Jan-Derk Bakker and Erik Mouw Copyright (C) 2000 Johan Pouwelse Blob comes with ABSOLUTELY NO WARRANTY; read the GNU GPL for details. This is free software, and you are welcome to redistribute it under certain conditions; read the GNU GPL for details. Autoboot in progress, press Enter to stop... Eftersom vi ännu inte lagt in nån kärna eller filsystem trycker vi enter, och ser följande. Autoboot aborted Type "help" to get a list of commands blob> Färdig kompilerade versioner av ARM-Linux samt ett enkelt filsystem finns att hämta på http://www.lart.tudelft.nl/lartware, men innan de är färdiga att laddas ner måste filerna UUenkodas enligt följande. %uuencode ramdisk.gz ramdisk.gz > ramdisk.uu %uuencode zimage zimage > zimage.uu
I Blob promten skriver vi %download kernel För att påbörja nerladdning. Blob kommer då att svara med att rekommendera oss att byta hastighet från 9600 till 115200, det går även att i Blob promten ställa in annan överföringshastighet. Switching to 115200 baud you have 60 seconds to switch your terminal emulator to the same speed and start downloading. After that blob will switch back to 9600 baud. Det enklaste är nu att öppna upp ett nytt terminal fönster och därifrån skicka kärnans image fil genom att skriva. %cat zimage.uu > /dev/ttys1 Då påbörjas överföringen som tar ett par minuter. När (Please switch your terminal back to 9600 baud) Received 509300 (0x0007C574) bytes Visas är kärnan på plats och vi byter tillbaka till hastigheten 9600 och får tillbaka vår Blob promt. För att slippa göra om denna procedur för varje omstart är det lämpligt att skriva in kärnan i flashminnet på följande sätt. %flash kernel För att lägga in filsystemet utförs exakt samma steg som ovan med den skillnaden att man skickar över ramdisk.uu. LARTen är nu klar att användas och kan startas om genom att skriva boot alternativt göra en reset.
BLOB i pseudokod Det som utfördes i BLOB ett praktiskt exempel utförs av BLOBens main() funktion samt dess funktions anrop. Nedan följer en steg för steg beskrivning i psuedokod av vad som sker i BLOB när den startas. Main() Först av allt tänds LED (lysdioden lartens lysdiod) för att indikera att bootloadern körs. Serie porten ställs om till 9600 baud. Diverse textsträngar skrivs ut. Den aktuella minnes mängden hämtas genom funktions anrop. Där efter läggs blob, kärna och filsystem från flashminnet till RAM. (om de finns sparade i flash.) Ytterligare information skrivs ut. Lägger sig i en 10 sekunders loop och väntar på att en tangent trycks ned, om ingen tangent tryckts ned går bootloadern direkt till att starta upp linux. Om en tangent trycks ned skrivs en enkel prompt ut som reagerar på följande kommandon: "boot" "clock" "download " "flash " "help" "reblob" "reload " "reset" "speed " "status" Vart och ett av dessa parametrar ger upphov till nedanstående funktionsanrop.
Boot() Clock() Startar linux boot sekevens. Ger användaren möjlighet att ställa in systemklockan. Download() Anges med tre möjliga alternativ: "download blob" Sätter startadressen där bloben skall läggas samt förbereder för att ta emot en ny version av blob. "download kernel" sätter startadressen där kärnan skall läggas samt förbereder för att ta emot en imagefil av kärnan. "download ramdisk" sätter startadressen där filsystemet skall läggas samt förbereder för att ta emot en imagefil av filsystemet. Flash() Om någon av ovanstående alternativ är angivna ställs seriportens hastighet om till 115200 baud. Diverse text strängar skrivs ut och programmet väntar 60 sekunder på att få användaren skall skicka något på serieporten. Tas inte något emot skrivs felmeddelande ut och programmet återgår till tidigare promt, samt ställer tillbaka serieporten till 9600 baud. Fungerar på samma sätt som download med den skillnaden att den sparar det som finns i RAm till flashminne, samt kör en felkontroll.
Help() Visar samtliga kommondon som finns att tillgå samt intruktioner hur de används. Reblob() Reload() Startar om bootloader programmet. Tar samma argument som download() och laddar om blob, kärna eller filsystem från flashminnet till ramdisk. Reset() Speed() värdet. Status() Ställer hastigheten till 9600 baud samt skriver 100 blank steg till terminal programmet. Tar följande argument: "1200" "9600" "19200" "38400" "57600" "115200" Den sätter sedan nedladdnings hastigheten det angivna Skriver ut en mängd olika textsträngar med varierande information.
Referenser Information från följande webbadresser har används vid skapandet av denna rapport. http://www-2.cs.cmu.edu/~wearable/software/docs/assabet-linuxreport/node2.html#section00021000000000000000 http://www.aleph1.co.uk/armlinux/docs/armbooting/t1.html http://www.wirelesssolutionsjournal.com/articles/issue2/aleph_1_pages.pdf http://www.aleph1.co.uk/armlinux/docs/armbooting/x115.html http://www.aleph1.co.uk/armlinux/book/boottools.html http://www.aleph1.co.uk/armlinux/book/book1.html http://debianlinux.net/linux.html