Sam buildroot jest zbiorem skryptów, które mają zautomatyzować tworzenie obrazu systemu, ułatwić jego modyfikowanie oraz dodawanie nowych funkcjonalności. Efektem pracy buildroot'a są gotowe obrazy z systemem. Na taki obraz składają się 4 podstawowe rzeczy. Kernel, rootfs, pakiety oraz DTS.
Najpierw o strukturze katalogów buildroot'a. Wymienię tylko te najważniejsze katalogi.
board - folder, w którym każdy podfolder przechowuje pliki, potrzebne do zbudowania dystrybucji na dany hardłer. Zazwyczaj w takim folderze znajdują się pliki konfiguracyjne do kernela. Patche, lub też pliki, które nadpisują domyślne pliki w systemie plików (a masło jest maślane)
configs - Znajdują się tam pliki przechowujące domyślną konfigurację dla jakiegoś rozwiązania sprzętowego. Pierwsza część nazwy określa typ,model lub nazwę producenta procka, płyty lub jakiegoś zestawu, druga to "_defconfig". Jak wspomniałem wyżej, przechowuje się tam domyślne ustawienia dla całego buildroot'a, dla danego rozwiązania. Dlatego taką konfigurację należy TYLKO raz załadować, na samym początku pracy z danym sprzętem, lub też w sytuacji gdzie chcemy powrócić do domyślnych ustawień.
Komenda
Kod: Zaznacz cały
make defconfig xxx_defconfig
Powoduje zapisanie domyślnej konfiguracji z pliku xxx_defconfig do pliku .config w głównym katalogu.
Ps: każda zmiana w konfiguracji buildroota (make menuconfig) zmienia ustawienia właśnie w tym pliku .config.
package - folder w którym znajdują się informację dotyczące pakietów. Sa tam dokładne adresy, wersje, informacje wykorzystawne przez menuconfig itd itp.
output/build - folder w którym znajduja się pakiety zbudowane. W tym miejscu można wprowadzać zmiany w pakietach i kernelu, takie jak poprawki kodu itd.
output/images - folder w którym znajdują się wynikowe pliki typu zImage uImage itd
Każdy z pakietów jest konfigurowalny w mniejszym lub wiekszym stopniu poprzez komendę
Kod: Zaznacz cały
make menuconfig
w ten sposób dodaje się je do systemu plików
Ważnym elementem pakietów są tak zwane "znaczki". Są to pliki, które określają w jakim stanie znajduje się dany pakiet (get, extract, build, install) - nazwy mogą się różnić, piszę z pamięci - w katalogu output/build/nazwa_pakietu/ znajdują się powyższe pliki. Po uruchomieniu polecenia make, w pliku mejkfajl lub innym skrypcie znajduje się reguła, która przeczesuje każdy pakiet pod względem tych plików. Jeżeli więc usuniemy któryś, to on rozpocznie ponownie proces, którego efektem jest usunięty plik. Np jak zostanie usunięty build, dany pakiet zostanie przebudowany itd itp.
Mimo iż wcześniej rozdzieliłem kernel od pakietów, to kernel jest również pakietem. Dlatego inne pakiety takie jak dodatkowe liby, czy np aplikacje konfiguruje się poprzez samo menuconfig a nie linux-menuconfig. Ponieważ
Kod: Zaznacz cały
make linux-menuconfig
powoduje uruchomienie konfiguratora kernela, który jak już wspomniałem jest traktowany jako pakiet, ale trochę inny. W tym oknie można zedytować takie rzeczy jak moduły samego kernela, jego wersję lub też obsługę DTS'a (do czego przejdę później
Czyli sterowniki uruchamiane są w konfiguratorze jądra. Tam też jest pewien myk, ponieważ drajvery można zbudować jako: skompilowane i automatycznie uruchamiane w jądrze [*] lub też jako osobne moduły [M] które należy ręcznie uruchomić ( komenda insmod lub też modprobe ). Obrana przeze mnie technika pracy z modułami jest taka że początkowo każdy nowy sterownik jest budowany jako osobny moduł tak aby skontrolować jego uruchamianie, chociazby poprzez komendę dmesg. W momencie jak dany sterownik zachowuje się poprawnie po prostu zmieniam w menu konfiguracyjnym znaczek przy jego nazwie z [M] na [*] co oznacza że przy następnym budowaniu będzie on automatycznie wbudowany i uruchomiony przez kernel.
DTS (device tree source) jest opisem konfiguracji sprzętu podłączonego do procka a przez to do samego linuxa. Zazwyczaj dts znajduje się w katalogu board/odpowiedni_podkatalog i jest on kopiowany do katalogu output/build/linux-***/arch/arm/boot/dts. Tam też jest tworzony plik DTB (device tree blob), który jest skompilowanym plikiem DTS. On jest kopiowany wtedy do ostatecznego pliku obrazu (zImage, uImage).
Myślę że na początek to powinno wystarczyć. W miarę możliwości i wiedzy odpowiem na pytania. Informacje mogą być trochę zamieszane, pomieszane i wymieszane, ponieważ pisałem to z doskoku pomiędzy innymi czynnościami
Pozdrawiam