Linux Kernel to w wielkim skrócie jest to najważniejsza część systemu operacyjnego – zajmuje się ochroną pamięci, zarządza sprzętem oraz schedulingiem czyli ustala kiedy jaki proces może się wykonywać.
Z tego poradnika dowiesz się:
- Jak ściągnąć źródła kernela dla RPi
- Co można zmienić w konfiguracji i jak ją odpalić
- W jaki sposób przetestować zmiany
Wstęp
Ten wpis jest materiałem uzupełniającym dla poradnika video – znajdziesz go pod tym linkiem:
Nie musimy zaczynać od zera – możemy wgrać na kartę SD software przygotowany przez RPi foundation. Dzięki temu będziemy mieli od razu gotowy firmware oraz rootfs. Będziemy mogli się skupić tylko na konfiguracji kernela.
Przed kompilacją musimy zainstalować kilka programów niezbędnych do kompilacji oraz cross compilation toolchain. Cross compilation albo kompilacja skrośna, oznacza, że będziemy kompilować software na inną architekturę niż komputer na którym pracujemy. Mój laptop jest na x86 a raspbery na ARM. Taki sposób działania jest znacznie wygodniejszy niż kompilacja natywna na raspberry.
Skrypt sprawdzający czy programy są zainstalowane:
#!/bin/bash
# List of required programs
REQUIRED_PROGRAMS=(bc bison flex libssl-dev make libncurses5-dev crossbuild-essential-arm64)
# Track missing programs
MISSING_PROGRAMS=()
# Check if each program is installed
for program in "${REQUIRED_PROGRAMS[@]}"; do
if ! dpkg -s "$program" &> /dev/null; then
MISSING_PROGRAMS+=("$program")
fi
done
# Output results
if [ ${#MISSING_PROGRAMS[@]} -eq 0 ]; then
echo "All required programs are installed."
else
echo "Missing programs: ${MISSING_PROGRAMS[*]}"
echo "You can install them using:"
echo "sudo apt update && sudo apt install -y ${MISSING_PROGRAMS[*]}"
fi
Jeśli jakikolwiek z nich nie jest zainstalowany – możesz posłużyć się następującymi komendami (działają na Ubuntu):
sudo apt install bc bison flex libssl-dev make libc6-dev libncurses5-dev
sudo apt install crossbuild-essential-arm6
crossbuild-essential-arm6 to nazwa toolchaina, za pomocą którego można kompilować i budować programy na architekturę ARM64 (czyli nasze Raspberry Pi).
Kompilacja i konfiguracja
Zaczynamy od ściągnięcia repozytorium ze źródłami kernela i wstępnej konfiguracji:
git clone --depth=1 https://github.com/raspberrypi/linux
cd linux
KERNEL=kernel8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
Zmiany w konfiguracji można wprowadzić za pomocą narzędzia menuconfig:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
Wgranie obrazu
Poniższe komendy wgrywają skompilowane pliki na kartę SD
lsblk # sprawdzamy gdzie podmontowała się partycja karty SD
KERNEL=kernel8
mkdir -p ~/mnt
mkdir -p ~/mnt/boot
mkdir -p ~/mnt/root
sudo mount /dev/SDX1 ~/mnt/boot
sudo mount /dev/SDX2 ~/mnt/root
#instalacja modułów
sudo env PATH=$PATH make -j12 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=~/mnt/root modules_install
# kopiujemy pliki wynikowe
sudo cp arch/arm64/boot/Image ~/mnt/boot/$KERNEL-test.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb ~/mnt/boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* ~/mnt/boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README ~/mnt/boot/overlays/
sudo umount ~/mnt/boot
sudo umount ~/mnt/root
dopisujemy zmianę w config.txt:
echo "kernel=$KERNEL-test.img" >> config.txt
Należy podmienić wartości SDX1 i SDX2 na odczytane z polecenia lsblk. W moim przypadku były to sda1 oraz sda2
Oficjalna dokumentacja
https://www.raspberrypi.com/documentation/computers/linux_kernel.html
Dodaj komentarz