Bootloaderis

> Pradinis straipsnis

Kaip ir normalios (x86) architektūros kompiuteriuose, rankiniams irgi reikalingas bootloaderis. Dažniausiai pačiame procesoriuje yra suhardkodinta tam tikra įkrovimo seka:

  • įkrauti iš SD kortelės
  • įkrauti iš flash atminties
  • įkrauti iš dar kažkur

Procesoriukas kiekvienoje iš atminties saugyklų ieško magiško numerio (priklauso nuo gamintojo). Radęs checksumą vykdo programą, kuri mūsų atveju ir yra bootloaderis. Neradęs ima tikrinti kitą iš sąrašo. Žinoma, konkreti seka ir veiksmai skiriasi nuo kiekvieno procesoriuko gamintojo, manojo galima rasti čia: http://linux-sunxi.org/Boot.

Seniau bootloaderis užkraudavo įrenginio konfigūracija ir paleisdavo linuxą, tačiau dabar linkstama prie to, kad jis tiesiog paleistų linuxą. Lentos konfigūracija įrašoma į tokį “device-tree”, kuris automatiškai įkeliamas kraunant linuxo kernelį.

Dažniausiai sutinkamas bootloaderis - uBoot. Neperseniausiai jis tapo atviro kodo, dėl to ir aš supratau kaip jis veikia ir netgi pats susikompiliavau.

Yra trys uBoot konfigūravimo būdai:

  • senovinis - piešopensourcinė versija, naudojami script.bin ir flex failai
  • sudėtingas - atviro kodo versija: nebereikia script failo, tačiau flex vis dar reikalingas
  • geriausias - konfigūruojamas panašiai kaip PC bootloaderis: viename faile nurodoma kur kernelis, o kur device-tree.

Taip pat yra du uBoot versios:

  • senoji - modifikuota pačių gamintojų, nelabai atviro kodo
  • normalioji - atviro kodo, atidaryta po to, kai gamintojams nusibodo patiems viską daryti

Senąją versiją reikėtų rinktis tik tuo atveju, jeigu naujojo nepalaiko įrenginukas. Tuo atveju prašome pasiskaityti kaip jį konfigūruoti.

Aš savąjį kompiliavau iš normaliosios versijos, naudodamas geriausią konfigūravimo būdą pagal šią instrukciją. Jeigu jus domina kiti būdai, pasiskaitykite čia: http://linux-sunxi.org/Mainline_U-Boot#Compile_U-Boot

1. Kompiliavimo įrankiai (toolchain)

Kadangi kompiliuosime ne ant kompiuteriuko, o ant standartinio PC, reikės kompiliuoti kryžmai (cross compile). Kompiliuojant ARMui grynas gcc netiks (nors jis ir turi arm tinkantį kompiliatorių, tas kompiliatorius ne visiems kompiuteriukams suprantamą kodą kompiliuoja). Man teko parsisiųsti linaro modifikuotą gcc. Aš viską dariau ant arch-linux’o.

Pirma, jums reikės susiinstaliuoti bibliotekas:

1
pacman -S dtc swig

Tada parsisiųsti linaro GCC kompiliatorių, bei nusistatyti globalius kintamuosius:

1
2
3
4
5
6
wget -c https://releases.linaro.org/14.09/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.xz
tar xf gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.xz

cd gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/
export ARCH=arm
export CROSS_COMPILE=${PWD}/bin/arm-linux-gnueabihf-

Dabar turėtumėte būti pasiruošę kompiliavimui.

2. Kompiliuojame uBoot

Ne taip greitai! Nepamirškime iš pradžių parsisiųsti patį uBoot:

1
2
3
git clone git://git.denx.de/u-boot.git
cd u-boot/
git checkout v2016.09.01

Kuri versija naujausia, galite pasitikrinti su git tag. uBoot turi gražų menuconfig įrankį, visai kaip ir linux kernelis. Failų sistemos struktūra irgi labai panaši. Konfigūracijos templeitai yra ./configs aplanke, o device-tree: ./arch/arm/dts/. Daugiau nieko ir nereikia, galime pradėti konfigūraciją:

1
2
3
make distclean
make Linksprite_pcDuino3_Nano_defconfig
make menuconfig

Kadangi mano lenta yra ne pcDuino3-nano, o pcDuino3b - reikėjo papildomai pakeisti kelis nustatymus - paimti iš pcDuino3 configo templeito. Kai viskas sukonfigūruota galime paleisti kompiliavimą:

1
make -j4

Mums reikalingas failas: ./u-boot-sunxi-with-spl.bin Kompiliavimas baigtas, dabar galime kompiliuoti kernelį arba, jeigu jau jį turime, pereiti prie uBoot įrašymo į SD-kortelę.