Kernelis
Dažniausiai kompiuteriukui galima rasti daugiau nei vieną kernelio versiją - gamintojų ir atviro kodo. Gamintojo kernelis dar skirstomas į gamintojo kompiliuotą ir savą, tik kompiliuotą iš gamintojo pateikto kodo.
Atviro kodo kernelis
Šį ir turėtum naudoti, tačiau jį pasirinkus bus daug problemų - ne viskas veiks, nebus 2D/3D spartinimo, srėbs daugiau elektros. Visgi galėsi pats pasirinkti kuriuos modulius įkompiliuoti, galėsi pats pasirašyti driverius ir pajusi lentą “iki galo”.
Gamintojo kernelis, kompiliuotas iš kodo
Tai gamintojo modifikuotas atviro kodo kernelis. Jo pakeitimai nėra įtraukti į normalų atviro kodo kernelį, nes kinai nemoka kodinti draugiškai. Taip pat tai nepilnas kernelis: taip, jis kompiliuojasi, bet kai kurių modulių kodas slepiamas. Kai kas veikia labiau nei normaliam kernelyje, tačiau vis tiek ne kažką. Norint, kad veiktų dar labiau, reikia nusikopijuoti sukompiliuotus modulius iš gamintojo kompiliuoto kernelio (turi sutapti kernelių versijos ir atitikti konfigai). Tai tarpinis variantas, kurio turėtum vengti.
Gamintojo kernelis
Šį kernelį ir jo modulius kompiliavo pats gamintojas. Jis veikia labiausiai iš visų trijų, tačiau tu jau nebegali jo modifikuoti ar papildyti savais moduliais. Kartu pateikiami ir jau sukompiliuoti ne atviro kodo moduliai, kuriuos galima nusikopijuoti į savo kernelį ir kartais jie veikia. Šį variantą reikėtų rinktis jeigu nori, kad viskas veiktų ir nenori kišti nagų prie branduolio.
Kernelio kompiliavimo instrukcija
Kernelio kompiliavimas ARM’ui nelabai skiriasi nuo kompiliavimo paprastam PC, tiesog reikės naudoti ne standartinį kompiliatorių, o kompiliuoti kryžmai. Taip pat, kompiliuojant PC’e neveiks automatinis aparatūros atpažinimas ir reikės rankomis nurodyti kas prilituota ant lentos. Visgi dėl to labai nusiminti nereikėtų, nes šiaip ar taip, vis tiek automatinis konfugūravimas nelabai veikia, nes ARM’o lentose naudojama įrangą neturi tokio daikto kaip “Plug&Play”.
1. Kompiliavimo įrankiai (toolchain)
Jeigu kompiliavimo įrankiais jau pasirūpinote ruošdami bootloaderį, galite praleisti šį punktą. Jei ne - skaitykite toliau. Kompiliuojant ARM’ui 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.
Parsisiunčiame ir išsarchyvuojame toolchainą:
1 | wget -c https://releases.linaro.org/14.09/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.xz |
Napamirškime nustatyti globalius kintamuosius, kad būtų naudojamas mūsų parsiųstas kompiliatorius, o ne standartinis gcc:
1 | cd gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/ |
Dabar turėtumėte būti pasiruošę kompiliavimui.
2. Parsisiunčiame kernelį
Aprašysiu, kaip kompiliuoti atviro kodo (mainstream) kernelį. Jeigu norite kompiliuoti gamintojo kernelį, procedūra tokia pati, tiesiog pakeiskite git’o url’ą.
1 | git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git |
3. Konfigūruojame
Yra prikepta visokių numatytų konfigūracinių failų (defconfigų) visokiems kompiuteriukams.
Visus juos galite peržiūrėti taip: ls ./arch/arm/configs/
Kadangi mano kompiuteriuko SoC (sakykim, procesorių) pagamino sunxi, man tinkamiausias failas - “sunxi_defconfig”, todėl jį ir naudosiu kaip šabloną:
1 | make sunxi_defconfig |
Internete mėtosi daug visokių paruoštų konfigų, bet ar jais pasitikėti, spręsk pats. Parsisiuntus konfigą iš interneto, jį nukopijuok į kernelio root direktoriją (cd linux-stable/) ir pervadink į .config (mv failas.config .config).
Kai jau templeitą turi, laikas imtis konfigūravimo iš peties:
1 | make menuconfig |
Jeigu turite populiarų kompiuteriuką jau viskas, konfigūravimas baigtas. Jeigu nepasisekė, kaip ir man - teks dar pavargti su device-tree. Visi device-tree lentų aprašymai sudėti čia: arch/arm/boot/dts/. Norint susirasti sau tinkamiausią galima pasinaudoti grep’u:
1 | ls arch/arm/boot/dts/ | grep -i pcduino |
Jeigu radai kokį su savo lentos pavadinimu - valio, nieko papildomo daryti nereikės. Man labiausiai tinkantys yra tokie:
- sun7i-a20-pcduino3.dts
- sun7i-a20-pcduino3-nano.dts
Bet nei vienas netinka iki galo - viename geriau aprašyti visi prietaisai, kitame tinkamesnė tinklo konfigūracija. Todėl paėmiau ir susikūriau savo device-tree sun7i-a20-pcduino3b.dts, kuriame sujungiau man tinkančias dalis iš abiejų failų. To failo daugiau niekur nereikia užregistruoti, kompiliuojami visi tame aplanke esantys device-tree.
4. Kompiliuojame
Kai jau konfigūravimas baigtas, beliko tik sukompiluoti. Tikiuosi nepamiršote nustatyti globaliųjų kintamųjų, kaip kad parašyta skyrelyje Kompiliavimo įrankiai (toolchain).
Paleidžiame kompiliavimą:
1 | make -j4 |
Kompiliavimo metu bus sukompoliuoti ir visi device-tree. Mums jų visų nereikia, reikia tik vieno - tinkančio mūsų lentai. Po kompiliavimo jie sudedami čia: arch/arm/boot/dts/.
Mums svarbūs failai:
- arch/arm/boot/zImage
- Šitas svarbus man, tau bus kitas failas, bet tame pačiame aplanke: arch/arm/boot/dts/sun7i-a20-pcduino3b.dtb
- Moduliai, kuriuos galima perkelti į aplanką taip:
make modules_install INSTALL_MOD_PATH=kur/juos/deti
susidėkime viską į vieną vietą:
1 | mkdir -p ../deploy |
Kernelio kompiliavimas baigtas, dabar galime paruošti linux failų sistemą ir nukopijuoti failus į SD-kortelę.