Benutzer-Werkzeuge

Webseiten-Werkzeuge


netbsd:cross-kompilation_eines_netbsd-kernels_fuer_eine_andere_hardware-architektur

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.

netbsd/cross-kompilation_eines_netbsd-kernels_fuer_eine_andere_hardware-architektur.txt · Zuletzt geändert: 2021/12/12 13:54 von sommteck