plik kernel.img
Podczas korzystania z jądra Linux kernel.imgnazwa pliku jest zmieniana linux/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ć zintegrowany initramfs(ramdysk), ale nie jest wymagany. Na przykład kernel.imgplik zapasowy nie zawiera elementu initramfswhile kernel_emergency.img.
Uwaga: Oficjalny przewodnik kompilacji jądra na wiki eLinux sugeruje, że powinieneś użyć imagetool-uncompressed.pynarzędzia do przygotowania kernel.imgpliku. Było to konieczne na początku RaspberyPi, ale obecnie bootloader może obsługiwać pliki zwykłe Imagei zImagepliki.
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.orgstronie) nie jest kompatybilna z RaspberryPi. Ponadto versatil_confignie jest dobre dla RaspberryPi, powinieneś użyć bcmrpi_defconfigzamiast tego (znajduje się w źródłach jądra kompatybilnych z RaspberryPi) lub bcmrpi_emergency_defconfigjeśli planujesz używać buildin initramfs.
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_COMPILEopcję we wszystkich swoich makepoleceniach.
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:
- Jako plik skompresowany (aby skorzystać z tej opcji, nie musisz instalować
gitnarzędzia i możesz to zrobić nawet na samym RapsberryPi): Kliknij ZIPikonę, nieco poniżej Codezakładki u góry strony. To powinno pozwolić ci pobrać najnowsze pliki źródłowe jako zipplik. 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 gitnarzę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 1argument, który uniemożliwia gitowi pobranie całej historii rozwoju (co jest ogromne):
git clone --depth 1 git://github.com/raspberrypi/linux.git
Użyj domyślnej konfiguracji dostarczonej przez fundację:
cp arch/arm/configs/bcmrpi_defconfig .config
Uruchom make oldconfigi odpowiedz na kilka pytań (w każdym pytaniu powinno być OK, pozostawiając domyślną odpowiedź):
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
Skompiluj jądro:
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
Skopiuj moduły jądra do /tmp/modules:
make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
Użyj Imagepliku 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ę, że initramfsmoż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 jest kernel_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 iniramfsobrazu, spróbuj zbudować własny. Wszystko, co powinno być potrzebne, to wskazanie pobranego katalogu przy użyciu CONFIG_INITRAMFS_SOURCEopcji konfiguracji jądra.
Uwagi końcowe
Powinieneś to zrobić w 3 krokach:
- Spróbuj zbudować i uruchomić jądro bez
initramfspliku.
- Spróbuj dodać gotową
initramfszawartość do jądra.
- Zmień tę
initramfszawartość zgodnie z własnymi potrzebami.