 hacker:: [[kaspe]]

##content goes here
= Embedded Linux =
== Johdanto ==
Tarkoitus on kirjoitella tänne sulautetun linuxin rakentamisesta, aluksi emulaattorille ja myöhemmin raudalle. Päätarkoitus on tallentaa jonnekkin kokeilut ja mahdollisesti avuksi muille kiinnostuneille. Vanhat muistiinpanot ovat jo bittiavaruudessa. Pitää joskus koota tänne tulevista asioista ''virallinen'' artikkeli.

== Kokoonpano ==
Järjestemä on Ubuntu 10.04LST, joten kaikki paketti asennukset ovat verrattavissa ''Lucid Lynx:n'' puhtaaseen asennukseen. Kiintolevy tilaa kannattaa olla 10GB vapaana. 4GB ylittyy helposti.
Seuraavat paketit on syytä asentaa aluksi:
{{{
sudo apt-get install build-essential bison flex gettext libncurses5-dev texinfo autoconf automake libtool
}}}
Kannattaa tehdä hakemisto missä työskennellään:
{{{
mkdir work
cd work
}}}
=== Emulaattori ===
Alussa käytän QEMU emulaattori, myöhemmin myös muita.
Emulaattoriin tarvittavat paketit saa asennettua:
{{{
sudo apt-get install qemu-kvm-extras
}}}
Ubuntun repositiosta tuleva qemu riittää alussa pitkälle.
=== Kääntäjä ===
Teen esimerkit ARM prosessorille, joten cross compiler täytyy hakea:
{{{
wget https://sourcery.mentor.com/sgpp/lite/arm/portal/package8734/public/arm-none-eabi/arm-2011.03-42-arm-none-eabi-i686-pc-linux-gnu.tar.bz2
}}}
Pura kääntäjä haluamaasi paikkaan tai kuin esimerkissä työhakemiston alle.
{{{
tar xvjf arm-2011.03-42-arm-none-eabi-i686-pc-linux-gnu.tar.bz2
}}}
Lisäksi täytyy määritellä käännettäessä tarvittavat ympäristömuuttujat. Korjaa CROSS_COMPILE polku osoittamaan oikeaan paikkaan.
{{{
export ARCH=arm
export CROSS_COMPILE=$HOME/work/arm-2011.03/bin/arm-none-eabi-
}}}

== Kernel ==
Kernelin noutaminen ja kääntäminen kohde järjestelmään. Kernel.org oli huoltokatkolla kun tätä kirjoittelin, niin kernelin koodit haetaan esimerkissä Funetin mirrorista.
{{{
wget http://www.nic.funet.fi/pub/mirrors/ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.4.tar.gz
tar zxvf linux-2.6.39.4.tar.gz
cd linux-2.6.39.4
}}}
Määritellään kerneli default asetuksille QEMU:lle sopivaksi.
{{{
make versatile_defconfig
make menuconfig
}}}
Lisää EABI tuki kerneliin, löytyy "Kernel Features" ja "Use the ARM EABI to combile the kernel". Käännä kernel
{{{
make
}}}
Mikäli ympäristömuuttujia ei ole määritelty voidaan kääntäminen tehdä myös.
{{{
make ARCH=arm versatile_defconfig
make ARCH=arm menuconfig
make ARCH=arm CROSS_COMPILE=$HOME/work/arm-2011.03/bin/arm-none-eabi-
}}}
Kerneliä pääsee tässävaiheessa kokeilemaan.
{{{
qemu-system-arm -M versatilepb -m 128M -kernel arch/arm/boot/zImage
}}}
Mikäli tulostus menee VNC ikkunaan saat sen esiin.
{{{
vncviewer 127.0.0.1:5900
}}}
{{attachment:kaspe_ArmKernelRootfsError.PNG}}

Kernelin käynistyminen loppuu erroriin koska tiedostojärjestelmää ei ole olemassa.

== RootFS ==
Emuloinnissa käytettävän tiedostojärjestelmän rakentaminen.

=== Oma ohjelma ===
Ennen varsinaista tiedostojärjestelmän rakentamista tehdään pieni ohjelma jota ajetaan emuloitavassa järjestelmässä.

Koska jatkossa käännettävät ohjelmat ajetaan linuxin päällä täytyy kääntämiseen käyttää eri kääntäjää. Hae ja asenna arm-none-linux versio kääntäjästä.
{{{
cd ~/work
wget https://sourcery.mentor.com/sgpp/lite/arm/portal/package8739/public/arm-none-linux-gnueabi/arm-2011.03-41-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
tar xvjf arm-2011.03-41-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
}}}
CROSS_COMPILE ympärisstö muuttuja täytyy muuttaa osoittamaan uuteen kääntäjään.
{{{
export CROSS_COMPILE=$HOME/work/arm-2011.03/bin/arm-none-linux-gnueabi-
}}}
ympäristö muuttujaa ei tosin tarvitse muuttaa seuraavan esimerkki ohjelman takia.

Tee hakemisto work kansioon.
{{{
mkdir hello
cd hello
}}}

Luo tiedosto hello.c.
{{{
nano hello.c
}}}

{{{#! c
#include <stdio.h>
void main() {
        printf("Terve!\n");
        while(1);
}
}}}

Käännetään ohjelma.
{{{
../arm-2011.03/bin/arm-none-linux-gnueabi-gcc -static hello.c -o hello
}}}
Luodaan tiedostojärjestelmä.
{{{
echo hello | cpio -o --format=newc > rootfs
}}}
Ajetaan ohjelama QEMU:lla
{{{
cd $HOME/work
cp linux-2.6.39.4/arch/arm/boot/zImage .
qemu-system-arm -M versatilepb -m 128M -kernel zImage -initrd hello/rootfs -append "root=/devam rdinit=/hello"
}}}
VNC ikkunassa pitäisi näkyä "Terve!" teksti.
=== BusyBox ===
!BusyBox ohjelmistolla pystyy helposti luomaan minimaalinen linux tiedostojärjestelmä mistä löytyy tarvittavat työkalut.
{{{
wget http://busybox.net/downloads/busybox-1.19.2.tar.bz2
tar xvjf busybox-1.19.2.tar.bz2
cd busybox-1.19.2
export CROSS_COMPILE=$HOME/work/arm-2011.03/bin/arm-none-linux-gnueabi-
export ARCH=arm
make defconfig
make menuconfig
}}}
Muuta asetuksista static lib päälle.

Käännetään:
{{{
make
make install
cd _install
ls
}}}
Asennetaan kernelin moduulit luotuun _install hakemistoon.
{{{
cd ../../linux-2.6.39.4
make modules_install INSTALL_MOD_PATH=$HOME/work/busybox-1.19.2/_install
}}}
Palataa !BusyBox hakemistoon.
{{{
cd ../busybox-1.19.2_install
}}}
Luo serutaava rakenne:
{{{
mkdir proc
mkdir sys
mkdir dev
mkdir etc
mkdir etc/init.d
nano etc/init.d/rcS
}}}
rcS-tiedoston sisältö:
{{{
 #!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
}}}
Luodaan tiedostojärjestelmän image.
{{{
find . | cpio -o --format=newc > ../rootfs.img
cd..
gzip -c rootfs.img > ../rootfs.img.gz
}}}
Käynnistä Qemu komennolla:
{{{
qemu-system-arm -M versatilepb -m 128M -kernel zImage -initrd rootfs.img.gz -append "root=/dev/ram rdinit=/sbin/init"
}}}

{{attachment:kaspe_ArmKernelCpuInfo.PNG}}

== BuildRoot ==

== Skyeye ==

== uClinux ==

== Bootloader ==

 started:: 2011-09-17
----
jatkuu...
----
CategoryProjekti
