Zbudowałem jądro Linuksa (3.0.1) dla mojego Raspberry Pi, wykonując następujące czynności:
1. Downloading kernel source
2. tar xvf source.tar.bz2
3. downloading arm cross compilation tool.
4. tar xvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
5. setting up path for cross tool export PATH=$PATH:/home/shan/<cross tool folder>/bin/
6. after entering linux source dir make ARCH=arm versatile_defconfig (is this reliable with raspberry pi)
7. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
8. zImage is generated in /arch/arm/boot
Moje pytanie brzmi: jak mogę zbudować kernel.img? Myślę, że zawiera zImage + ramdysk, ale jak mogę to zbudować?
Czy ktoś może mi pomóc w tworzeniu ramdysku i spakowaniu tych dwóch do pliku kernel.img? Chcę uruchomić to jądro na moim Raspberry Pi.
cross-compilation
linux
kernel
arm
Shantanu Banerjee
źródło
źródło
kernel.org
stronie?Odpowiedzi:
plik kernel.img
Podczas korzystania z jądra Linux
kernel.img
nazwa pliku jest zmienianalinux/arch/arm/boot/Image
. Powinno być również możliwe (lub przynajmniej ostatnim razem, gdy sprawdzałem) użycie skompresowanej wersji tego pliku -zImage
. Może zawierać zintegrowanyinitramfs
(ramdysk), ale nie jest wymagany. Na przykładkernel.img
plik zapasowy nie zawiera elementuinitramfs
whilekernel_emergency.img
.Uwaga: Oficjalny przewodnik kompilacji jądra na wiki eLinux sugeruje, że powinieneś użyć
imagetool-uncompressed.py
narzędzia do przygotowaniakernel.img
pliku. Było to konieczne na początku RaspberyPi, ale obecnie bootloader może obsługiwać pliki zwykłeImage
izImage
pliki.Problem ze źródłami jądra
Bardzo ważne jest to, że budując jądro dla RaspberryPi, nie można po prostu użyć żadnej jego wersji. Działa tylko specjalna wersja przeniesiona do RaspberryPi. Niestety obecna wersja upstream (znaleziona na
kernel.org
stronie) nie jest kompatybilna z RaspberryPi. Ponadtoversatil_config
nie jest dobre dla RaspberryPi, powinieneś użyćbcmrpi_defconfig
zamiast tego (znajduje się w źródłach jądra kompatybilnych z RaspberryPi) lubbcmrpi_emergency_defconfig
jeśli planujesz używać buildininitramfs
.Instrukcje budowania jądra
Najlepszym miejscem do pobierania źródeł jądra dla RaspberryPi jest github . Możesz również znaleźć przydatne wyjaśnienie, jak je zdobyć i jak skompilować na oficjalnej wiki RasbperryPi . Oto moja mała uproszczona wersja opisanych kroków (UWAGA: Zakładam, że chcesz skompilować jądro krzyżowo. Jest ono znacznie szybsze i powinno dawać takie same wyniki, ale możliwe jest także budowanie jądra natywnie na RaspberryPi):
Pobierz oficjalny zestaw narzędzi do tworzenia własnych. W każdym razie zakładam, że jest zainstalowany
/usr/bin/arm-linux-gnueabi-*
. Jeśli masz go w innym miejscu, powinieneś zmienićCROSS_COMPILE
opcję we wszystkich swoichmake
poleceniach.Przejdź do https://github.com/raspberrypi/linux strony, na której można znaleźć oficjalne źródła jądra RapsberryPi. Możesz pobrać kod na dwa sposoby:
git
narzędzia i możesz to zrobić nawet na samym RapsberryPi): KliknijZIP
ikonę, nieco poniżejCode
zakładki u góry strony. To powinno pozwolić ci pobrać najnowsze pliki źródłowe jakozip
plik. Możesz użyć git, aby to zrobić, ale to (jak opisano na wiki) będzie wymagało dużo więcej miejsca i czasu. Następnie rozpakuj plik, aby uzyskać drzewo źródłowe.Korzystanie z
git
narzędzia (to nie działało dla mnie na RaspberryPi, ponieważ prawdopodobnie jest mała ilość pamięci RAM, ale powinno działać OK na komputerach stacjonarnych (zauważ--depth 1
argument, który uniemożliwia gitowi pobranie całej historii rozwoju (co jest ogromne):Użyj domyślnej konfiguracji dostarczonej przez fundację:
Uruchom
make oldconfig
i odpowiedz na kilka pytań (w każdym pytaniu powinno być OK, pozostawiając domyślną odpowiedź):Skompiluj jądro:
Skopiuj moduły jądra do
/tmp/modules
:Użyj
Image
pliku jakokernel.img
Prześlij wszystkie moduły z
/tmp/modules/lib/modules/
komputera do/lib/modules/
katalogu na rootfs RaspberryPi.Dodawanie initramfs
Nie zawiera to jednak instrukcji tworzenia
initramfs
. Ponieważ jest to bardzo szeroki temat (w zasadzie musisz stworzyć działające środowisko przestrzeni użytkownika Linuxa, tak naprawdę nie ma ograniczenia, jak skomplikowane może być), nie omówię teraz tego tutaj. Zwrócę tylko uwagę, żeinitramfs
można go używać w dwóch różnych formach - samodzielnej, w której jest to osobny plik i wbudowany, w którym jest zintegrowany z plikiem obrazu jądra (tak jak w nim jestkernel_emergency.img
). Druga opcja powinna być obsługiwana przez bootloader RaspberryPi, ale istnieją pogłoski , że jest zepsuta w bieżącej wersji oprogramowania, więc prawdopodobnie powinieneś użyć wersji wbudowanej.Najlepszym sposobem na rozpoczęcie jest użycie działającej zawartości initramfs (która jest używana w pliku kernel_emergency.img) poprzez pobranie jej z innego podstawowego repozytorium github i dopiero po uruchomieniu jądra przy użyciu tego
iniramfs
obrazu, spróbuj zbudować własny. Wszystko, co powinno być potrzebne, to wskazanie pobranego katalogu przy użyciuCONFIG_INITRAMFS_SOURCE
opcji konfiguracji jądra.Uwagi końcowe
Powinieneś to zrobić w 3 krokach:
initramfs
pliku.initramfs
zawartość do jądra.initramfs
zawartość zgodnie z własnymi potrzebami.źródło
zip
;git
wydajnie przenosi pliki i możesz użyć,depth=1
aby zapobiec historii pobierania (myślę).Jeśli używasz tej samej wersji Debiana na obu, używając X-Apt, dpkg-cross itp. ... a narzędzia emdebian mogą działać bardzo dobrze.
Źródło: używane do tworzenia aplikacji c ++ dla wbudowanych systemów ARM z uruchomionym emdebianem.
źródło