Labbar inbyggda hack på SAM9-L9260
Detta är en labbserie som är tänkt att användas för självstudier för Lysatormedlemmar.
Kortet som ska användas är det Olimexkortet som saknar display.
Det står Olimex och SAM9-L9260 på ovansidan vid platsen för 40-pinnarskontakten.
Börja med att titta på föreläsningen eller på föreläsningen i högupplöst video och titta på föreläsningsmaterialet.
Dokumentation och exempelkod finns på http://www.lysator.liu.se/inbyggda-hack/olimex/SAM9-L9260/
Ännu mer doukmentation och kod till SAM9-L9260 och en del andra kort finns på
http://www.lysator.liu.se/~kjell-e/embedded/ .
Datorn bishibosh i ~(tilde) är uppsatt som arbetsstation för labbar i inbyggda system.
Bishibosh har två nätverksinterface där eth1 är kopplat till ett separat nät avsett för
laborationer med inbyggda system. Nätet har adress 192.168.0.0/24. eth1 på bishibosh har adress 192.168.0.1.
Du behöver vara med i gruppen inbyggda-hack. Prata med en root innan du börjar labba.
Bishibosh är uppsatt med tjänsterna dhcp, tftp och NFS för det interna labbnätverket.
NFS exporterar /export/embedded. Du bör skapa en katalog i /export/embedded där katalogen ska
ha samma namn som din användaridentitet på Lysator. Här kan du senare lägga root-filsystem som ska
NFS-monteras av labbkortet. tftp är chrootad till /embedded/tftproot/ vilket innebär att sökvägen du ska ange på labbkortet när du laddar filer från tftpservern inte ska inte innehålla /embedded/tftproot/. Du bör skapa en katalog i /embedded/tftproot/ där katalogen ska ha samma namn som din användaridentitet på Lysator. Exempel: du har filen /embedded/tftproot/dinuser/uImage på bishibosh och för att ladda den ska du på labbkortet ange sökvägen /dinuser/uImage.
Förberedelser
- Skapa katalogerna /export/embedded/dinuser, /embedded/build/dinuser, /embedded/tftproot/dinuser/ och /embedded/tools/dinuser där du byter ut dinuser mot ditt användarnamn.
- Hämta filen codesourcery-armgcc-2009q1-repack.tar.bz2 och lägg den i din hemkatalog. Packa upp den med tar xvfj codesourcery-armgcc-2009q1-repack.tar.bz2 Du har nu installerat ett toolchain i ~/bin/codesourcery-armgcc-2009q1/. Detta toolchain ska du använda i senare laborationer för att korskompilera programkod för kortet.
- Starta picocom och kör den mot /dev/ttyUSB0 (om flera USB till serieportsadaptrar är anslutna kan det istället vara någon av ttyUSB1, ttyUSB2... som du behöver ansluta till). Sätt hastigheten till 115200 bps. Kommandot blir då: picocom -b 115200 /dev/ttyUSB0
- Labbkortet, SAM9-L9260, batterieliminator och sladdar finns i kartongen som är märkt "inbyggda hack". Kartongen ska stå i närheten av arbetsplatsen vid datorn bishibosh. När du är färdiglabbad kan du lägga tillbaka kort, batterieliminatorn och sladdar i kartongen.
- Kontrollera att batterieliminatorn är inställd på 5v och att plus är på mittstiftet (TIP).
Övrigt innan du kör igång
Notera att du måste använda enkelfnuttar ' till U-Boot inte dubbelfnuttar " när du sätter ett värde till en variabel.
Laboration 1: U-Boot
I denna laboration ska du bekanta dig med bootloadern U-Boot. Se till att picocom är igång. Anslut sladdarna till kortet, serieport, nätverk, ström. När du är i bootloadern innan kortet har hunnit börja boota Linux tryck på någon tangent i din picocom.
- Kör kommandot help för att se vilka kommandon som finns.
- Se till att kortet får en IP-adress via dhcp.
- Prova help ping.
- Testa att pinga 192.168.0.1.
- Lista alla variabler i U-Boot.
- Det går att sätta en fast IP-adress i U-Boot genom att sätta en IP-adress i variabel ipaddr i U-Boot. Sätt IP-adressen till 192.168.0.17.
- Ta reda på hur flashminnet är partitionerat. Var i flash ligger linuxkärnan? Använd help för att ta reda på vilket kommando du ska använda.
Laboration 2: Mer U-Boot
I denna laboration ska du bekanta dig ännu mer med U-Boot. Här ska du boota ett litet Linuxsystem som finns i en initramfs på tftp-servern. Se till att picocom är igång. Anslut sladdarna till kortet, serieport, nätverk, ström. Innan kortet bootar Linux tryck på någon tangent.
- I U-Boot sätt IP-adressen till 192.168.0.17.
- Sätt serverip till 192.168.0.1
- Ladda in Linuxkärnan som finns i filen /uImage-SAM9-L9260 på tftp-servern, 192.168.0.1, och lägg kärnan på adress 0x22200000.
- Ladda in rootfilsystemet som finns i filen /initramfs.uImage på tftp-servern, 192.168.0.1, och lägg filen på adress 0x22600000.
- Sätt bootargs till 'mem=64M root=/dev/ram rw console=ttyS0,115200N8 ip=192.168.0.17:192.168.0.1:192.168.0.1:255.255.255.0:olimex:eth0:off'
- Boota genom att ge adressen till kärnan och adressen till rootfilsystemet till kommandot bootm
- När systemet är uppe kan du logga in som root med lösenordet olimex.
- Gör ls -l på /sbin och /bin
- Titta på hur filerna i /etc och /etc/init.d ser ut.
- Boota om kortet och stanna vid U-Boot.
- Kopiera Linuxkärnan som finns i flash in till RAM och lägg den på adress 0x22200000. Tips: se hur man gör i variabeln bootcmd i U-Boot.
- Sätt IP-adressen 192.168.0.17 på kortet.
- Sätt serverip till 192.168.0.1
- Ladda in rootfilsystemet som finns i filen /initramfs.uImage på tftp-servern, 192.168.0.1, och lägg filen på adress 0x22600000.
- Sätt bootargs till 'mem=64M root=/dev/ram rw console=ttyS0,115200N8 ip=192.168.0.17:192.168.0.1:192.168.0.1:255.255.255.0:olimex:eth0:off'
- Boota genom att ge adressen till kärnan och adressen till rootfilsystemet till kommandot bootm
- Boota om kortet till U-Boot.
- I U-boot titta på variablerna bootargs och bootcmd.
- Om du kör kommandot boot så kommer den att köra run bootcmd och boota det som finns i flash på kortet.
- Boota antingen genom att köra boot eller run bootcmd . Kortet kommer nu att boota debian.
Laboration 3: Boota med filer från ett USB-minne
I denna laboration ska du ladda en fil med kärnan och en med ett rootfilsystem från ett USB-minne och sedan boota med dessa.
- Kopiera filerna uimage-sam9-l9260 och initramfs.uImage från /embedded/tftproot/ till ett vfat-formatterad USB-minne.
- Starta picocom och koppla in strömmen på kortet och stanna vid U-Boot.
- Stoppa i USB-minnet i USB-porten på kortet.
- Gör help usb för att se vad du kan göra med usb i U-Boot.
- Aktivera usb-stödet i U-Boot.
- Lista alla partitioner på USB-minnet.
- Kör fatinfo usb 0 för att se vad det är för ett USB-minne och för att se vad det är för filsystemstyp på det.
- Lista filerna på usb 0. Tänk på att det är fatfilsystem på USB-minnet så du behöver använda fat-kommandon för att accessa USB-minnet.
- Ladda kärnan uimage-sam9-l9260 till adress 0x22200000 (tänk på att det är fatfilsystem på USB-minnet.)
- Ladda initramfs.uImage till adress 0x22600000 (tänk på att det är fatfilsystem på USB-minnet.)
- Sätt bootargs till 'mem=64M root=/dev/ram rw console=ttyS0,115200N8 ip=192.168.0.17:192.168.0.1:192.168.0.1:255.255.255.0:olimex:eth0:off'
- Boota kortet med kärnan och rootfilsystemet i initramfs.
Laboration 4: kompilera busybox och bygga ett rootfilsystem
I denna laboration ska du korskompilera busybox och med hjälp av U-Boot och därefter med genext2fs och mkimage skapa en image med ett rootfilsystem.
- I denna laboration ska du använda det codesourcery toolchain som du har installerat i bin-katalogen i din hemkatalog. Kör source ~/bin/linux_cross_compile.sourceme för att sätta upp PATH att peka på ditt toolchain, sätta ARCH till att tala om att det är arm som det ska kompileras för och sätta CROSS_COMPILE som anger prefix för namnet på ditt toolchain. I och med det behöver du inte ange ARCH=arm till make nedan.
- I den här laboration kommer du använda genext2fs och mkimage. Manualsidorna till dessa finns på bishibosh under /embedded/tools/share/man/. Enklast är att sätta MANPATH att peka på denna katalog för att kunna läsa manualsidorna. Du kan göra det med export MANPATH=/usr/share/man:/embedded/tools/share/man/
- Gå till din hemkatalog och skapa katalogen embedded.
- Gå ner i katalogen embedded.
- Hämta busybox, antingen version 1.18.4 härifrån eller senaste versionen från busybox.net.
- Packa upp busybox med tar xvfj busybox-1.18.4.tar.bz2 och gå därefter ner i katalogen du fick.
- Kör nu make menuconfig och navigera runt i konfigurationen. Gå till "Busybox Settings"->"Build Options" och välj "Build BusyBox as a static binary". Observera att det är viktigt att du gör det för du kommer inte ha några libfiler i det färdiga rootfilsystemet.
- Gå in på "Miscellaneous Utilities" och avaktivera ionice. Gå in på "Networking Utilities" och avaktivera telnetd och tftpd. Avsluta och spara konfigurationen (default är att spara som .config).
- Kompilera busybox med make.
- Installera med make install . Nu kommer make att skapa en katalog _install och lägga in busybox och länkar där.
- _install behöver lite fler kataloger. Du vill skapa proc, sys, var, var/log, tmp, etc, etc/init.d och dev. Alla dessa kan skapas med:
mkdir -p _install/{proc,sys,var/log,tmp,etc/init.d,dev}
- Till init behövs konfigurationsfilen /etc/inittab och ett shellscript /etc/init.d/rcS (eftersom init enligt inittab ska köra /etc/init.d/rcS).
Skapa en /etc/inittab med följande utseende:
# /etc/inittab
#
::sysinit:/etc/init.d/rcS
ttyS0::respawn:/sbin/getty 115200 ttyS0
::restart:/sbin/init
::shutdown:/bin/umount -a -r
Init kommer att köra /etc/init.d/rcS vid boot. På serieporten ttyS0 kommer init att köra programmet getty som ger en loginprompt. Vi omstart ska init startas och när systemet stängs av/bootar om ska alla filsystem avmonteras.
- Skapa en /etc/init.d/rcS med följande utseende:
#! /bin/sh
# /etc/init.d/rcS
echo "mounting /proc "
mount -t proc proc /proc
echo "mounting /tmp"
mount -t tmpfs tmpfs /tmp
echo "mounting /sys"
mount -t sysfs sysfs /sys
echo "Starting system logger"
klogd
syslogd
# Start dhcp client
echo "starting dhcp client on eth0"
udhcpc -i eth0
hostname my-small-arm-system
Denna kommer att montera några filsystem, starta några tjänster, starta dhcp-klienten och sätta ett namn på datorn. Kom ihåg att göra rcS exekverbar med t.ex. chmod a+x /etc/init.d/rcS.
- För inloggning vill du ha en liten /etc/passwd så att man måste ange lösenord för att kunna logga in som root.
root:$1$XFwxsu9i$/gWE7M1cBWPKKfDsUwL1U1:0:0:root:/:/bin/sh
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
- Nu är filsystemet fyllt med de filer som behövs förutom device-filer. Devicefiler kommer du att skapa samtidigt som du skapar en image-fil. För att kunna göra det ska du använda programmet genext2fs som finns i /embedded/tools/bin. Lägg till /embedded/tools/bin till din PATH. (Källkoden till genext2fs finns på genext2fs.sourceforge.net ifall du vill kompilera den själv.) Med hjälp av genext2fs kan man skapa en image-fil
inklusive devicefiler utan att behöva vara root.
- Se till att du står i katalogen ovanför _install.
- Kör genext2fs --help för att se vilka flaggor och argument som
genext2fs tar.
- Till genext2fs behövs en fil som beskriver vilka kataloger och devices
som den ska skapa. Raderna i filen ska ha formen:
#<name> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count>
name ska vara namn på fil eller katalog, typ är typ av fil (d för directory, c för character device, b för block device), mode är filrättigheterna, uid är ägare, gid är grupptillhörighet. För kataloger ska övriga fält fyllas med -. För devicefiler ska major vara satt till major number, minor minor numer. För flera devices används start, inc och count som anger vilket tal som ska avsluta devicenamnet för den första devicefilen, increment anger steglängd och count antal.
Exempel för att skapa en katalog:
/dev d 755 0 0 - - - - -
Du kan använda följande fil, spara den som devices.txt
#<name> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count>
/dev d 755 0 0 - - - - -
/dev/console c 640 0 0 5 1 - - -
/dev/fb0 c 640 0 0 29 0 - - -
/dev/full c 640 0 0 1 7 - - -
/dev/kmem c 640 0 0 1 2 - - -
/dev/mem c 640 0 0 1 1 - - -
/dev/mtd c 640 0 0 90 0 0 2 16
/dev/mtdblock b 640 0 0 31 0 0 1 16
/dev/mtdr c 640 0 0 90 1 0 2 16
/dev/nftla b 640 0 0 93 0 - - -
/dev/nftla b 640 0 0 93 1 1 1 8
/dev/nftlb b 640 0 0 93 16 - - -
/dev/nftlb b 640 0 0 93 17 1 1 8
/dev/null c 640 0 0 1 3 - - -
/dev/ptyp c 640 0 0 2 0 0 1 10
/dev/ptypa c 640 0 0 2 10 - - -
/dev/ptypb c 640 0 0 2 11 - - -
/dev/ptypc c 640 0 0 2 12 - - -
/dev/ptypd c 640 0 0 2 13 - - -
/dev/ptype c 640 0 0 2 14 - - -
/dev/ptypf c 640 0 0 2 15 - - -
/dev/ram b 640 0 0 1 0 0 1 2
/dev/ram b 640 0 0 1 1 - - -
/dev/rtc c 640 0 0 10 135 - - -
/dev/tty c 640 0 0 4 0 0 1 4
/dev/tty c 640 0 0 5 0 - - -
/dev/ttyS c 640 0 0 4 64 0 1 8
/dev/ttyp c 640 0 0 3 0 0 1 10
/dev/ttypa c 640 0 0 3 10 - - -
/dev/ttypb c 640 0 0 3 11 - - -
/dev/ttypc c 640 0 0 3 12 - - -
/dev/ttypd c 640 0 0 3 13 - - -
/dev/ttype c 640 0 0 3 14 - - -
/dev/ttypf c 640 0 0 3 15 - - -
/dev/zero c 640 0 0 1 5 - -
- Med hjälp av genext2fs och devicefilen ovan skapa en image-fil.
Använd flaggan -U för att få alla filerna i image-filen ägda av
root. Använd -D devices.txt för att skapa devicefiler.
När du anger storleken till genext2fs med -b <blocks> kan du prova att börja med 2048 (2MByte) och se om det räcker. Om du får felmeddelandet genext2fs: couldn't allocate a block (no free space), behöver du ta en något större storlek. Ange -d _install för att tala om att det är filerna i katalogträdet _install som ska tas med och sist på kommandoraden ange namnet på image-filen. Kalla image-filen initrd.
- Komprimera image-filen med gzip -9 för att få den så komprimerad som möjligt.
- Det som återstår är att lägga till U-Boot-information vilket
görs med programmet mkimage som följer med bootladern
U-Boot. Källkod till U-Boot finns på
ftp://ftp.denx.de/pub/u-boot/. mkimage finns
i /embedded/tools/bin/ på datorn bishibosh.
Exempel: mkimage -n 'Text label' -A architecture -O
operating_system -T image_type -C compression_type -d
data_fil_to_read_from imagefile
- För detta system är arkitekturen arm, operativsystem är linux, image-typ är ramdisk, komprimeringstyp är gzip, data-fil är din initrd.gz som du skapade och imagefile kan du kalla initrd.uImage.
- På bishibosh kopiera initrd.uImage till /embedded/tftproot/dinuser/.
- Se till att picocom är igång och koppla sedan in strömmen till kortet.
- I U-Boot sätt IP-adressen till 192.168.0.17.
- Sätt serverip till 192.168.0.1
- Ladda in Linuxkärnan som finns i filen /uImage-SAM9-L9260 på tftp-servern, 192.168.0.1, och lägg kärnan på adress 0x22200000.
- Ladda in rootfilsystemet som finns i filen /dinuser/initrd.uImage på tftp-servern, 192.168.0.1, och lägg filen på adress 0x22600000.
- Sätt bootargs till 'mem=64M root=/dev/ram rw console=ttyS0,115200N8 ip=192.168.0.17:192.168.0.1:192.168.0.1:255.255.255.0:olimex:eth0:off'
- Boota genom att ge adressen till kärnan och adressen till rootfilsystemet till kommandot bootm
- När systemet är uppe kan du logga in som root med lösenordet olimex.
- Titta i /dev på vilka devicefiler du fick.
Om det inte gick bra att boota kan det bero på att busybox är dynamiskt länkad istället för statiskt länkad. Kontrollera även bootargs så att de är korrekta.
Laboration 5: kompilera busybox och bygga ett rootfilsystem inklusive libfiler
I denna laboration ska du korskompilera busybox och länka den dynamiskt och med hjälp av U-Boot och därefter med genext2fs och mkimage skapa en image med ett rootfilsystem. Rootfilsystemet ska innehålla en kopia av libfilerna från ditt toolchain.
- Gå till katalogen där du har källkoden till busybox och kör make menuconfig
- Gå till "Busybox Settings"->"Build Options" och avaktivera valet "Build BusyBox as a static binary". Du vill i denna laboration bygga busybox och länka den dynamiskt.
- Kompilera busybox.
- Kör make install och gå till katalogen _install
- Kör arm-none-linux-gnueabi-gcc --print-file-name libc.so.6 så att du ser var ditt toolchains libfiler ligger.
- Kopiera libkatalogen och alla filer som ligger i den till ditt rootfilsystem.
- Se till att du står i katalogen ovanför _install.
- Kör genext2fs för att skapa en image-fil med ditt rootfilsystem (se föregående laboration). Kalla image-filen initrd-shared
- Komprimera image-filen med gzip -9 för att få den så komprimerad som möjligt.
- Skapa en image-fil med U-Boot header med hjälp av mkimage (se föregående laboration). Kalla filen initrd-shared.uImage
- På bishibosh kopiera initrd-shared.uImage till /embedded/tftproot/dinuser/.
- Se till att picocom är igång och koppla sedan in strömmen till kortet.
- I U-Boot sätt IP-adressen till 192.168.0.17.
- Sätt serverip till 192.168.0.1
- Ladda in Linuxkärnan som finns i filen /dinuser/uImage-SAM9-L9260 på tftp-servern, 192.168.0.1, och lägg kärnan på adress 0x22200000.
- Ladda in rootfilsystemet som finns i filen /dinuser/initrd-shared.uImage på tftp-servern, 192.168.0.1, och lägg filen på adress 0x22600000.
- Sätt bootargs till 'mem=64M root=/dev/ram rw console=ttyS0,115200N8 ip=192.168.0.17:192.168.0.1:192.168.0.1:255.255.255.0:olimex:eth0:off'
- Boota genom att ge adressen till kärnan och adressen till rootfilsystemet till kommandot bootm
Laboration 6: korskompilera Linuxkärnan
I denna laboration ska du öva på att korskompilera Linuxkärnan och prova och boota med denna kärna.
- Gå till katalogen embedded under din hemkatalog.
- Hämta filen linux-2.6.31-rc3-olimex.tar.bz2.
- Packa upp den med tar xvfj linux-2.6.31-rc3-olimex.tar.bz2
- Gå ner i katalogen du fick. cd linux-2.6
- Se till att ~/bin/codesourcery-armgcc-2009q1/bin finns med i din PATH. Lägg även till /embedded/tools/bin till din PATH så att du har med sökvägen till katalogen där mkimage finns. export PATH=~/bin/codesourcery-armgcc-2009q1/bin:/embedded/tools/bin:$PATH
- Sätt skalvariabeln ARCH till arm. export ARCH=arm
- Sätt skalvariabeln CROSS_COMPILE till prefixdelen av namnet på ditt toolchain, d.v.s. arm-none-linux-gnueabi-. export CROSS_COMPILE=arm-none-linux-gnueabi-
- Hämta konfigurationen kernel-punkt.config och spara den som .config högst upp i källkodsträdet för kärnan.
- Kör make menuconfig
- Gå in på 'General setup' och se till att 'Configure standard kernel features (for small systems)' är aktiverad.
- Se till att 'Initial RAM filesystem and RAM disk (initramfs/initrd) support' är aktiverad.
- Gå upp till översta nivån och aktivera stöd för kärnmoduler 'Enable loadable module support' och gå ner i undermenyn och aktivera även 'Module unloading'
- Gå upp till översta nivån och gå ner i 'Networking support'->'Networking options' och se till att 'TCP/IP networking' och 'IP: kernel level autoconfiguration' är aktiverade.
- Gå tillbaka upp till översta nivån och gå ner i 'File systems'->'Network File Systems' och aktivera 'NFS client support' så att den ligger fast i kärnan (inte modul) och aktivera därefter 'Root file system on NFS'. Root file system on NFS kan du inte välja om inte NFS client support ligger fast inlagd i kärnan.
- Avsluta menuconfig och välj yes för att spara konfigurationen som därmed sparas i filen .config. Du har nu konfigurerat en kärna för små system med stöd för NFS-root-filsystem och med stöd för kärnmoduler.
- Kompilera nu kärnan med make uImage. OBS! Om katalogen där mkimage ligger inte finns med i PATH går det inte att bygga en uImage.
- När kärnan är färdigkompilerad kopiera arch/arm/boot/uImage till /embedded/tftproot/dinuser/uImage-mykernel
- Se till att picocom är igång och koppla sedan in strömmen till kortet.
- I U-Boot sätt IP-adressen till 192.168.0.17.
- Sätt serverip till 192.168.0.1
- Ladda in Linuxkärnan som finns i filen /dinuser/uImage-mykernel på tftp-servern, 192.168.0.1, och lägg kärnan på adress 0x22200000.
- Ladda in rootfilsystemet som finns i filen /dinuser/initrd.uImage på tftp-servern, 192.168.0.1, och lägg filen på adress 0x22600000.
- Sätt bootargs till 'mem=64M root=/dev/ram rw console=ttyS0,115200N8 ip=192.168.0.17:192.168.0.1:192.168.0.1:255.255.255.0:olimex:eth0:off'
- Boota genom att ge adressen till kärnan och adressen till rootfilsystemet till bootm. bootm 0x22200000 0x22600000
- När systemet är uppe kan du logga in som root med lösenordet olimex.
Laboration 6b: korskompilera en patchad standardkärna
I denna laboration ska du öva på att korskompilera en standard Linuxkärna och prova och boota med denna kärna.
- Se till att PATH, ARCH och CROSS_COMPILE är inställda på samma sätt
som du gjorde i laboration 6.
- Gå till http://maxim.org.za/at91_26.html och hämta patchen till linuxkärna 2.6.38, (filen 2.6.38-at91.patch.gz).
- Dekomprimera patchen med gunzip 2.6.38-at91.patch.gz
- Gå till http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.tar.bz2 och hämta linuxkärna 2.6.38.
- Packa upp kärnan på samma sätt som du gjorde i föregående övning (laboration 6).
- Gå ner i katalogen du fick.
- Applicera patchen med patch -p1 < ../2.6.38-at91.patch Här förutsätts patchen ligga i katalogen ovanför där du står.
- Hämta konfigurationen kernel-punkt.config och spara den som .config högst upp i källkodsträdet för kärnan.
- Kör make oldconfig för att få med inställningar för sådant som har
tillkommit i den nyare versionen av kärnan (nyare i förhållande till den
version som inställningarna var gjorda för).
- Kör make menuconfig och gör samma inställningar som i laboration 6.
- Kompilera och kör kärnan på samma sätt som du gjorde i laboration 6, d.v.s. skapa en uImage och ladda in den via tftp när du befinner dig i u-boot.
Laboration 7: boota med NFS-rootfilsystem
I denna laboration ska du boota kortet med den kärna som du byggde i föregående laboration och det rootfilsystem som du byggde med hjälp av busybox i laboration 5. Den stora skillnaden mot tidigare är att här ska root-filsystemet NFS-exporteras och monteras som root-filsystem under boot. I denna laboration ska systemet dessutom använda mdev för dynamisk hantering av devicefiler.
- Gå till katalogen där du har den uppackade källkoden för busybox.
- Kör make menuconfig och gå in på 'Linux System Utilities' och kontrollera att mdev är vald.
- Om den inte är det får du göra om laboration 5 och se till att mdev är vald.
- Gå ner i katalogen _install och vidare ner i etc/init.d
- Byt ut rcS mot följande fil:
#! /bin/sh
# /etc/init.d/rcS
loggfile=/var/log/rcS.logg
date > $loggfile
echo "mounting tmpfs on /dev" >> $loggfile
mount -t tmpfs -o size=64k,mode=0755 tmpfs /dev >> $loggfile 2>&1
mkdir /dev/pts >> $loggfile 2>&1
mount -t devpts devpts /dev/pts >> $loggfile 2>&1
echo "mounting /proc " >> $loggfile
mount -t proc proc /proc >> $loggfile 2>&1
echo "mounting /sys" >> $loggfile
mount -t sysfs sysfs /sys >> $loggfile 2>&1
echo "mounting /tmp" >> $loggfile
mount -t tmpfs tmpfs /tmp >> $loggfile 2>&1
echo "Starting mdev" >> $loggfile
sysctl -w kernel.hotplug=/sbin/mdev >> $loggfile 2>&1
mdev -s >> $loggfile 2>&1
echo "Starting system logger" >> $loggfile
klogd >> $loggfile 2>&1
syslogd >> $loggfile 2>&1
# Start dhcp client
echo "starting dhcp client on eth0" >> $loggfile
udhcpc -i eth0 >> $loggfile 2>&1
# Start ssh daemon dropbear
echo "Starting dropbear ssh server" >> $loggfile
/usr/local/sbin/dropbear >> $loggfile 2>&1
hostname my-small-arm-system
Genom att först montera ett tmpfs-filsystem på /dev, montera /sys och /proc för att därefter starta mdev kommer alla devicefiler som behövs att automatisk finnas/skapas i /dev.
Kom ihåg att göra rcS exekverbar med t.ex. chmod a+x /etc/init.d/rcS.
- Skapa katalogen /export/embedded/dinuser/rootfs
- Medans du står i katalogen _install kopiera alla filer, kataloger och underkataloger till /export/embedded/dinuser/rootfs/ cp -r * /export/embedded/dinuser/rootfs
- Se till att picocom är igång och koppla sedan in strömmen till kortet.
- I U-Boot sätt IP-adressen till 192.168.0.17.
- Sätt serverip till 192.168.0.1
- Ladda in Linuxkärnan som finns i filen /uImage-mykernel på tftp-servern, 192.168.0.1, och lägg kärnan på adress 0x22200000.
- Sätt bootargs med setenv bootargs 'mem=64M root=/dev/nfs rw console=ttyS0,115200N8
nfsroot=192.168.0.1:/export/embedded/dinuser/root/,proto=tcp ip=192.168.0.17:192.168.0.1:192.168.0.1:255.255.255.0:olimex:eth0:off'
Alternativt kan du sätta bootargs till: 'mem=64M root=/dev/nfs rw console=ttyS0,115200N8
nfsroot=192.168.0.1:/export/embedded/dinuser/root/,proto=tcp ip=dhcp'
- Boota genom att ge adressen till kärnan till bootm. bootm 0x22200000
- När systemet är uppe kan du logga in som root med lösenordet olimex.
Grattis du har nu bootat kortet med ett NFS-monterat root-filsystem som använder mdev, "mdev is a mini-udev implementation for dynamically creating device nodes in the /dev directory."
Laboration 8: bygga ett toolchain
I denna laboration ska du bygga ett toolchain, som du senare kan använda för att korskompilera annan programkod med. Detta toolchain ska byggas
för att köras på en x86/x86_64-baserad dator och kompilera kod för
en arm-baserad Linuxmaskin. Detta toolchain ska du installera under /embedded/tools/dinuser/toolchain/
- Gå till katalogen /embedded/build/dinuser.
- Hämta källkoden till crosstool-ng-1.10.1.tar.bz2 eller den senaste versionen från http://crosstool-ng.org/download/crosstool-ng/
- Packa upp den med tar xfj crosstool-ng-1.10.1.tar.bz2
- Gå ner i katalogen du fick.
- Nu ska du förbereda byggandet av verktyget ct-ng som du ska lägga i
katalogen /embedded/build/dinuser/crosstool-ng
- Kör ./configure --prefix=/embedded/build/dinuser/crosstool-ng
- Kompilera med make
- Installera ct-ng med make install
- Gå till /embedded/build/dinuser/ och skapa katalogen work.
- Lägg till /embedded/build/dinuser/crosstool-ng/bin till din PATH
- Gå ner i katalogen work.
- Kör ct-ng list-samples . Du får nu upp en lista över färdiga konfigurationer för att bygga olika toolchains.
- För att välja en konfiguration kör man ct-ng <konfigurationen>
- Välj konfigurationen arm-unknown-linux-gnueabi.
- Nu ska du göra en del inställningar. Starta konfigurationen av ditt toolchain med ct-ng menuconfig
- Gå in på 'Paths and misc options'
- Sätt 'Local tarballs directory' till /embedded/build/dinuser/work/tarballs. Crosstool-ng kommer att tanka hem tar-arkiv med källkod till bland annat gcc, binutils m.m. och lägga i den katalogen. Se även till att välja 'Save new tarballs'
- Sätt 'Prefix directory' till /embedded/tools/dinuser/toolchain/${CT_TARGET}
- Gå tillbaka till översta nivån i menuconfig och gå in på 'Operating System' ->'Target OS' och välj Linux.
- Gå till 'Linux kernel version' och välj '2.6.31.14'. Detta är viktigt eftersom du på kortet kör en 2.6.31-kärna och därmed inte kan välja en nyare kärnversion för ditt toolchain (äldre versioner går bra).
- Gå tillbaka till översta nivån i menuconfig och gå in på 'C-library'->'C library' och välj eglibc.
- Under 'C-library' kan du även behöva aktivera 'checkout instead of export'.
- Gå tillbaka till översta nivån i menuconfig och om du vill ha C++stöd så ska du gå ner i 'C compiler' och välja till C++. Se dock till att välja bort Fortran och Java om du inte absolut vill ha stöd för dessa språk.
- Avsluta och spara.
- Bygg ditt toolchain med ct-ng build Bygget kommer att ta en god stund (räkna med en timma. Den kommer nu att tanka hem packa upp och patcha 'linux-2.6.31.14', 'gmp', 'mpfr', 'libelf', 'binutils', 'gcc', 'ecj-latest', 'eglibc', 'dmalloc', 'duma', 'gdb', 'ncurses', 'expat', 'ltrace', 'strace'.
- Grattis! Nu har du byggt dig ett eget toolchain. Du kan nu lägga till /embedded/tools/dinuser/toolchain/arm-unknown-linux-gnueabi/bin/ till din PATH och börja använda detta toolchain för att korskompilera saker för kortet.
Laboration 9: kompilera u-boot
I denna laboration ska du kompilera u-boot och provköra den i en virtuell maskin.
U-Boot finns att ut från http://www.denx.de/wiki/U-Boot.
- Gå till /embedded/build/dinuser/
- Hämta u-boot från ftp från denx.de.
- Packa upp tar-arkivet och gå ner i katalogen som du fick (u-boot-2010.09).
- Nu ska du ändra i konfigurationen för versatile. Alla konfigurationer finns som c-headerfiler och ligger i katalogen include/configs. Editera include/configs/versatile.h och ändra baudrate till 115200 (CONFIG_BAUDRATE) och ändra promptens utseende (CONFIG_SYS_PROMPT). Titta gärna på resten av konfigurationen som är för RAM-minne, flash, tillgängliga kommandon i u-boot, variabler i u-boot etc.
- Se till att PATH, ARCH och CROSS_COMPILE är satta som i laboration 6.
- Välj konfigurationen för versatile genom att köra make versatile_config
- Kompilera u-boot med make
- Om du tittar i katalogen tools kommer du att finna att du även har fått programmet mkimage byggt.
- Starta en xterm med xterm &.
- I denna xterm starta qemu med u-boot i. qemu-system-arm -M versatilepb -m 128M -nographic -kernel u-boot.bin
- Du ska nu ha fått igång u-boot som kör i en virtuell maskin.
Laboration 10: korskompilera ett program
I denna laboration ska du korskompilera ett program med hjälp av det toolchain som du i en tidigare laboration installerade under /embedded/tools/dinuser/toolchain/
- Gå till Introduktion till make och hur man bygger egna makefiler och läs
igenom texten.
- Gå till någon lämplig katalog under din hemkatalog och hämta och spara filerna blink.c, leds.c och blink.h
- Se till att /embedded/tools/dinuser/toolchain/arm-unknown-linux-gnueabi/bin finns med i din PATH.
- Skapa en enkel makefil som kompilerar blink.c till blink.o och leds.c till leds.o och som länkar blink.o och leds.o till programbinären blink där blink ska länkas statiskt (eftersom ditt toolchain har andra libbar än de som du tidigare installerade i rootfilsystemet). Observera att du ska använda ditt toolchain till detta.
- Lägg även till install i din makefil.
- Kompilera och installera blink.
- Boota kortet till U-Boot och ladda in Linuxkärnan som finns i filen /uImage-SAM9-L9260 på tftp-servern, 192.168.0.1, och lägg kärnan på adress 0x22200000. Om du har stöd för både leds och NFS-rootfilsystem i den kärna som du kompilerade i tidigare övning då kan du använda den istället om du vill.
- Sätt bootargs så att du kan boota med ditt NFS-rootfilsystem.
- Boota.
- Provkör programmet blink.
Laboration 11: buildroot
I denna laboration ska du med hjälp av buildroot bygga ett komplett system; toolchain, u-boot, linuxkärna och rootfilsystem.
- Gå till /embedded/build/dinuser/
- Ladda hem http://buildroot.uclibc.org/downloads/buildroot-2011.08.tar.bz2
- Packa upp tar-arkivet och gå ner i katalogen som du fick (buildroot-2011.08).
- Ladda hem olimex.patch och lägg den i underkatalogen linux.
- Ladda hem olimexSAM9L9260_defconfig och lägg den i underkatalogen configs. Denna innehåller buildroot-konfigurationen för kortet Olimex SAM9L9260.
- Kör make help för att se vad du kan ge för argument till make.
- Välj olimexkonfigurationen med make olimexSAM9L9260_defconfig
- Nu kan du, om du vill, titta på och eventuellt ändra i buildroots konfiguration för olimexkortet med make menuconfig.
- På samma sätt kan du, om du vill, titta på och ändra i konfigurationen för linuxkärnan med linux-menuconfig.
- Det går även att titta på och ändra konfigurationen för busybox och uclibc med make busybox-menuconfig respektive make uclibc-menuconfig
- Starta kompileringen genom att köra make . Observera att detta kan ta en stund då den ska hämta all källkod från nätet och kompilera den. Denna källkod sparas i underkatalogen dl och hämtas därifrån vid en eventuell omkompilering.
- När kompileringen är klar hittar du resultatfilerna i output/images.
- Kopiera output/images/uImage till /embedded/tftproot/dinuser/ och kalla den uImage-buildroot
- Se till att picocom är igång och koppla sedan in strömmen till kortet.
- I U-Boot sätt IP-adressen till 192.168.0.17.
- Sätt serverip till 192.168.0.1
- Ladda in Linuxkärnan som finns i filen /dinuser/uImage-buildroot från tftp-servern, 192.168.0.1, och lägg kärnan på adress 0x22200000.
- Sätt bootargs till 'mem=64M root=/dev/ram rw console=ttyS0,115200N8 ip=dhcp'
- Boota genom att ge adressen till kärnan, 0x22200000, till kommandot bootm
- Om allt har gått som det ska har du nu ett system som är uppe och kör och du kan logga in som root på kortet utan lösenord.
- För mer dokumentation till buildroot gå till http://buildroot.org/ .
Ansvarig för dessa övningar är: Kjell Enblom