Inhaltsverzeichnis
Cross-Kompilation eines NetBSD-Kernels für eine andere Hardware-Architektur
Das Cross-Kompilieren eines Kernels ist vor allem dann sinnvoll, wenn die Hardware, für die der Kernel erstellt werden soll, nicht sehr leistungsfähig ist. Zum Beispiel, weil es sich um eine Embedded-Plattform handelt, oder die Architektur des Prozessors schon aufgrund des enormen Alters eher einen historischen Charakter besitzt und der ganze Kompiliervorgang unter dieser (alten) Hardware zu viel Zeit in Anspruch nehmen würde. Der Kernel wird also dabei auf einem anderen leistungsfähigeren Computer – wie zum Beispiel einem aktuellen Desktop-PC konfiguriert und kompiliert. Anders als wenn der Kernel für die gleiche Hardware-Architektur wie, die des Host-Systems erstellt wird, sind hierbei noch zusätzlich weitere Schritte vor dem eigentlich Kompiliervorgang nötig.
Im Beispiel soll zum Zeitpunkt der Erstellung dieser Anleitung unter dem aktuellen NetBSD in Version 9.2 ein angepasster Kernel für einen Computer der VAX-Reihe von DEC erstellt werden. Die NetBSD-Version sowohl des VAX-Computers als auch des Desktop-Computers sind dabei identisch. Auf dem leistungsfähigeren Desktop-Computer sollten während der Installation von NetBSD auch bereits die Compiler-Werkzeuge mit installiert werden. Die Hardware-Architektur des Desktop-Computers ist im Beispiel die heutzutage üblich AMD64 für die 64-Bit X86-Prozessorfamilien von AMD und Intel.
Beziehen der Quellen von NetBSD
Neben den Kernel-Sourcen sind hierbei aber noch die Quellen für die NetBSD „Toolchain“ nötig. Diese enthalten das BSD-kompatible make, C/C++ -Compiler, Linker, Assembler, Konfigurationsprogramme sowie eine ganze Reihe von Tools, die nur benötigt werden, wenn eine vollständige NetBSD-Version cross-kompiliert werden soll. Diese werden hierfür nicht benötigt, sind aber dabei.
$ wget ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-9.2/source/sets/gnusrc.tgz $ wget ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-9.2/source/sets/src.tgz $ wget ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-9.2/source/sets/syssrc.tgz $ su Password: # cd / # tar xfz /home/sommteck/gnusrc.tgz # tar xfz /home/sommteck/src.tgz # tar xfz /home/sommteck/syssrc.tgz
Für das Cross-Kompilieren eines Kernels reicht es aus nur gnusrc.tgz, src.tgz und syssrc.tgz zu beziehen, man kann aber sharesrc.tgz und xsrc.tgz trotzdem auch beziehen, wenn man das möchte.
Aufbau der NetBSD Toolchain
Für das Cross-Kompilieren eines Kernels reicht es aus nur src.tgz und syssrc.tgz zu beziehen, man kann aber gnusrc.tgz, sharesrc.tgz und xsrc.tgzGrundsätzlich ist zu verstehen, dass die Werkzeuge (Compiler, Linker, Assembler etc.) des Desktop-PCs nur für die Software-Entwicklung auf dem eigenen Host-System ausgelegt sind. Sprich: es lassen sich auf dem PC nur Dateien und Programme für die 64-Bit X86-Architektur erstellen, wenn eine NetBSD-Version für AMD64 installiert ist. Die gesamte Toolchain ist nicht für alle NetBSD-Ports universell einsetzbar. Spätestens bei dem Assemblieren würde der Versuch scheitern, Dateien und Programme wie hier im Beispiel für die DEC VAX-Architektur unter einem System mit 64-Bit X86-Prozessor zu erstellen, weil die Hardware-Architekturen grundsätzlich auch verschiedene Befehlssatzarchitekturen besitzen. - Mal von der Anzahl verfügbarer Befehle mal ganz abgesehen. Trotzdem auch beziehen, wenn man das möchte.
Im ersten Schritt ist also die gesamte Toolchain für die VAX-Architektur aus den Quellen des src.tgz Pakets zu erstellen.
# cd /usr/src # ./build.sh -O /obj -m vax -a vax tools
- Die Option „-O“ gibt das Verzeichnis an, das für kompilierte Objektdateien verwendet werden soll. Es handelt sich dabei um eine Pflichtoption, da sonst nicht klar ist, wo die kompilierten Objekt-Dateien abgelegt werden sollen.
- Die Optionen „-m vax -a vax“ zeigen an, dass für den Maschinentyp vax mit der CPU-Typ vax gebaut wird. In dem Beispiel der DEC VAX sind sind sowohl Maschinen- als auch CPU-Typ identisch, da alle von NetBSD unterstützten VAX-Computern in dem einen VAX-Port zusammengefasst sind. Bei zum Beispiel den unterschiedlichen ARM-Architekturen und -CPU-Typen sieht das dann ganz anders aus. Es können alle verfügbaren Maschinen und CPU-Typen aufgelistet werden.
$ ./build.sh list-arch
Wenn die Tools erstellt werden, werden Informationen über sie und mehrere Umgebungsvariablen ausgegeben.:
===> Tools built to /obj/tooldir.NetBSD-9.2-amd64 ===> build.sh ended: Sun Nov 28 10:43:14 UTC 2021 ===> Summary of results: build.sh command: ./build.sh -O /obj -m vax -a vax tools build.sh started: Sun Nov 28 10:28:46 UTC 2021 NetBSD version: 9.2 MACHINE: vax MACHINE_ARCH: vax Build platform: NetBSD 9.2 amd64 HOST_SH: /bin/sh No $TOOLDIR/bin/nbmake, needs building. Bootstrapping nbmake MAKECONF file: /etc/mk.conf (File not found) TOOLDIR path: /obj/tooldir.NetBSD-9.2-amd64 DESTDIR path: /obj/destdir.vax RELEASEDIR path: /obj/releasedir Created /obj/tooldir.NetBSD-9.2-amd64/bin/nbmake Updated makewrapper: /obj/tooldir.NetBSD-9.2-amd64/bin/nbmake-vax Tools built to /obj/tooldir.NetBSD-9.2-amd64 build.sh ended: Sun Nov 28 10:43:14 UTC 2021 ===> .
Während des Builds werden konsequent Objektverzeichnisse verwendet, das heißt es werden spezielle Verzeichnisse geführt, die die plattformspezifischen Objektdateien halten und Ergebnisse kompilieren. In diesem Beispiel werden sie in Verzeichnissen mit dem Namen „obj.vax“ gespeichert, da schließlich für die VAX-Architektur als Zielplattform gebaut wurde.
Die Toolchain selbst ist ein Teil davon, aber da sie für ein AMD64-System gehostet und kompiliert wird, wird sie in einem eigenen Verzeichnis abgelegt, das angibt, von wo aus die Cross-Komilierung durchgeführt werden soll. Hier befindet sich die VAX-Toolchain:
# ls /obj/tooldir.NetBSD-9.2-amd64/bin nbasn1_compile nbmakewhatis nbxz nbawk nbmandoc nbyacc nbcap_mkdb nbmenuc nbzic nbcat nbmkcsmapper vax--netbsdelf-addr2line nbcksum nbmkdep vax--netbsdelf-ar nbcompile_et nbmkesdb vax--netbsdelf-as nbconfig nbmklocale vax--netbsdelf-c++ nbcrunchgen nbmknod vax--netbsdelf-c++filt nbctags nbmktemp vax--netbsdelf-cpp nbcvslatest nbmsgc vax--netbsdelf-dbsym nbdb nbmtree vax--netbsdelf-elfedit nbdisklabel nbnroff vax--netbsdelf-fdisk nbeqn nbpax vax--netbsdelf-g++ nbfile nbpaxctl vax--netbsdelf-gcc nbgenassym nbperf vax--netbsdelf-gcc-7.5.0 nbgencat nbpic vax--netbsdelf-gcc-ar nbgmake nbpwd_mkdb vax--netbsdelf-gcc-nm nbgpt nbrefer vax--netbsdelf-gcc-ranlib nbgrep nbrpcgen vax--netbsdelf-gcov nbgroff nbsed vax--netbsdelf-gcov-dump nbhexdump nbslc vax--netbsdelf-gcov-tool nbhost-mkdep nbsoelim vax--netbsdelf-install nbindxbib nbsortinfo vax--netbsdelf-ld nbinstall-info nbstat vax--netbsdelf-ld.bfd nbinstallboot nbstrfile vax--netbsdelf-mdsetimage nbjoin nbsunlabel vax--netbsdelf-nm nblex nbtbl vax--netbsdelf-objcopy nblorder nbtexi2dvi vax--netbsdelf-objdump nbm4 nbtexi2pdf vax--netbsdelf-ranlib nbmake nbtexindex vax--netbsdelf-readelf nbmake-vax nbtic vax--netbsdelf-size nbmakefs nbtsort vax--netbsdelf-strings nbmakeinfo nbuudecode vax--netbsdelf-strip
Manuelles Konfigurieren des Kernels
Da nun über eine funktionierende Toolchain verfügbar ist, sind die „üblichen“ Schritte zum Erstellen eines Kernels erforderlich – eine Kernel-Konfigurationsdatei erstellen, config(1) ausführen und dann erstellen. Da das Programm config(1) zum Erstellen von Header-Dateien und Makefile für einen Kernel-Build plattformspezifisch ist, muss das Programm „nbconfig“ verwendet werden, das Teil der neuen Toolchain ist. Abgesehen davon ist das Verfahren genauso wie das Kompilieren eines „nativen“ NetBSD-Kernels. Beteiligte Befehle sind hier.:
# cd /usr/src/sys/arch/vax/conf # /obj/tooldir.NetBSD-9.2-amd64/bin/nbconfig CUSTOM Build directory is ../compile/CUSTOM Don't forget to run "make depend"
Manuelles Kompilieren des Kernels
Alle Dateien und Tools stehen zur Verfügung, um den VAX-basierten Kernel auf dem Intel-basierten Hostsystem aus zu kompilieren.
# cd ../compile/CUSTOM/ # /obj/tooldir.NetBSD-9.2-amd64/bin/nbmake-vax depend # /obj/tooldir.NetBSD-9.2-amd64/bin/nbmake-vax
Nun kann der Kernel in der Datei netbsd auf den VAX-basierten Ziel-Computer (via scp, FTP-Host, etc.) übertragen und gebootet werden.
Links
https://en.wikipedia.org/wiki/Instruction_set_architecture
https://www.netbsd.org/docs/guide/en/chap-build.html (NetBSD Guide: Chapter 33. Crosscompiling NetBSD with build.sh)