Prinzip der Computerzusammensetzung Verständnis des BootLoader/BIOS/U-Boot-Konzepts

1. BIOS-Übersicht

        BIOS ist ein Akronym für Basic Input/Output System . Auch bekannt als System-BIOS, ROM-BIOS oder PC-BIOS.

        Das BIOS (Basic Input/Output) eines Computers ist seine Motherboard-Firmware, die Software, die auf einer niedrigeren Ebene als das Betriebssystem läuft und dem Computer mitteilt, von welchem ​​Laufwerk er booten soll, wie viel RAM er hat und andere wichtige Details wie die CPU steuert Frequenz. Sie können das BIOS-Menü aufrufen, um die Startreihenfolge zu ändern, Ihren PC zu übertakten, integrierte Peripheriegeräte zu deaktivieren und sogar ein Master-Passwort festzulegen.

        Vor dem Laden von Windows oder Linux initialisiert und testet das BIOS die Systemhardwarekomponenten (POST), lädt den Bootloader vom Massenspeichergerät und initialisiert dann den Kernel. Während dieses Vorgangs findet das BIOS den Master Boot Record (MBR), um den Bootvorgang abzuschließen.

        Das BIOS-Programm ist in einem kleinen ROM-Chip auf der Hauptplatine des Computers verankert. Normalerweise verwenden unterschiedliche Motherboards unterschiedliche BIOS.

        Obwohl die meisten Leute den Begriff BIOS verwenden, um sich auf jede Motherboard-Firmware zu beziehen, ist dies technisch falsch. Das Setup-Programm auf modernen Computern und Motherboards heißt UEFI (Universal Extensible Firmware Interface) und unterstützt größere Laufwerke und verfügt über reichhaltigere grafische Menüs als ältere BIOS-Versionen, die keinen größeren Speicher als 2,2 TB unterstützen konnten. Typischerweise wird UEFI jedoch als UEFI-BIOS und ältere Firmware als Legacy-BIOS bezeichnet. Alle modernen PCs verfügen über ein UEFI-BIOS.

2. Bootloader

        Der Bootloader ist das erste Stück Code, das nach dem Einschalten des eingebetteten Systems ausgeführt wird. Durch dieses kleine Programm wird die Hardwareinitialisierung durchgeführt, Informationen zur Speichergröße erhalten usw. und das Mobiltelefon wird in den Anpassungszustand versetzt. Nachdem es die Initialisierung der CPU und zugehöriger Hardware abgeschlossen hat, wird das Betriebssystemabbild oder das verfestigte eingebettete Anwendungsprogramm im Speicher installiert und springt dann zu dem Bereich, wo sich das Betriebssystem befindet, um das Betriebssystem zu starten.

        uboot ist eine konkrete Manifestation von BootLoader, uboot ist eine Teilmenge von Bootloader, aber BootLoader bezieht sich nicht nur auf uboot, so wie bios auch zu BootLoader gehört. In der täglichen Embedded-Entwicklung werden BootLoader und uboot jedoch oft miteinander vermischt.In vielen Fällen beziehen sich sowohl BootLoader als auch uboot auf uboot, da der verwendete BootLoader in der Embedded-Entwicklung im Grunde genommen uboot ist.

3. U-Boot

        Der Bootloader ist die kritische Software, die auf jedem System läuft. Immer wenn ein Computersystem zum ersten Mal hochfährt, ist das erste Stück Code, das geladen und ausgeführt wird, der Bootloader. Es bietet Benutzern eine Schnittstelle zum Laden des Betriebssystems und der Anwendungen. Die Kernfunktion von uboot besteht darin, den Kernel des Betriebssystems zu starten, und die Essenz von uboot ist ein Bare-Metal-Programm.

        Es gibt viele Bootloader im Open-Source-Ökosystem, wie GRUB, UEFI, RedBoot, Yaboot usw. U-Boot oder Das U-Boot ist jedoch der am häufigsten verwendete plattformübergreifende Open-Source-Bootloader. Es wird normalerweise in eingebetteten Systemen verwendet und das Hauptziel besteht darin, das System zu konfigurieren und das Betriebssystem der nächsten Ebene zu laden. Es unterstützt mehrere Architekturen und wird von Hardwareherstellern stark verfolgt.

        Der U-Boot-Bootloader wird normalerweise vom Boot-ROM des Systems aus verschiedenen Boot-Quellen geladen, normalerweise nichtflüchtigem Speicher wie NOR-Flash, SD-Karte und SPI-Flash, um die Hardware während des Einschaltens zu steuern. Sobald U-Boot mit der Ausführung beginnt, konfiguriert es die Hardware, um das Image der nächsten Ebene aus dem integrierten Speicher oder dem Netzwerk zu laden, und beginnt dann mit dem Laden des Images der nächsten Ebene. Nachdem das Image der nächsten Ebene geladen wurde, überträgt U-Boot die Ausführungskontrolle auf das ausführbare Image der nächsten Ebene. U-Boot bietet dem Benutzer auch eine "Shell"-ähnliche Schnittstelle, so dass der Benutzer die Hardwarekonfiguration verwenden kann, bevor das Image der nächsten Ebene übernimmt.

        uboot (universal boot) ist ein universeller Boot-Code, der CPUs mehrerer Architekturen unterstützt. uboot ist hochgradig angepasst und grob in Ressourcenverwaltung auf Soc-Ebene und Ressourcenverwaltung auf Board-Ebene unterteilt. Unterschiedliche CPUs oder unterschiedliche Entwicklungsboards derselben CPU, uboot ist unterschiedlich und muss entsprechend der Hardwareschaltung übertragen werden.

The U-Boot Documentation — Das U-Boot unbekannte Version Dokumentation https://u-boot.readthedocs.io/en/latest/

4. Kompilieren und in U-Boot flashen

        Der folgende Inhalt stammt von U-Boot – SFPi Salted Fish Pie

1. Kompilieren Sie U-Boot aus dem Quellcode

        Holen Sie sich U-Boot

        Holen Sie sich den Quellcode für U-Boot online. Nehmen Sie Github als Beispiel, klonen Sie das u-boot/u-boot- Repository:

$ git clone [email protected]:u-boot/u-boot.git

        Wenn Sie eine stabile Version von U-Boot möchten, können Sie ein Tag auschecken, nehmen Sie als Beispiel v2018.11-rc3:

$ git checkout v2018.11-rc3

        Oder laden Sie direkt den U-Boot-Quellcode der angegebenen Version herunter, nehmen Sie als Beispiel v2018.11-rc3:

$ wget https://github.com/u-boot/u-boot/archive/v2018.11-rc3.tar.gz
$ tar xvf v2018.11-rc3.tar.gz

2. Besorgen Sie sich die Cross-Compilation-Toolchain

        Wenn Sie ein Archlinux-Benutzer sind, können Sie  arm-none-eabi-gcc direkt installieren  :

$ sudo pacman -Sy arm-none-eabi-gcc

        Wenn Sie ein Debian-Benutzer sind, können Sie  gcc-arm-linux-gnueabihf installieren  :

$ sudo apt install gcc-arm-linux-gnueabihf

        Wenn Sie ein Ubuntu-Benutzer sind, können Sie  gcc-arm-linux-gnueabihf installieren

$ sudo apt-get install gcc-arm-linux-gnueabihf

        Wenn Sie ein Fedora-Benutzer sind, können Sie  arm-none-eabi-gcc-cs installieren

$ sudo dnf install arm-none-eabi-gcc-cs

        Für nicht aufgeführte Linux-Distributionen können Sie deren Quellen nach einer Cross-Compilation-Toolchain durchsuchen oder  Linaro GCC verwenden, falls nicht .

        Aufgrund der unterschiedlichen Präfixe der Cross-Compiler, die in jeder Version installiert sind, ist das CROSS_COMPILE, das wir später verwenden werden, arm-none-eabi-, wenn der installierte Compiler arm-none-eabi-gcc ist, das heißt, entfernen Sie den letzten gcc-Teil . Andere gebräuchliche sind arm-linux-gnueabihf- und arm-linux-gnueabi, beide sind in Ordnung.

3. Konfigurieren Sie U-Boot

        Die .config-Datei des bereitgestellten getesteten U-Boot wurde im  u-boot-  Verzeichnis von sbc-fish/sfpi gespeichert . Die .config hier kann zur Verwendung direkt in das U-Boot-Stammverzeichnis kopiert werden.

        Nehmen Sie U-Boot v2018.11-rc3 als Beispiel, gehen Sie in das U-Boot-Verzeichnis und laden Sie .config herunter:

$ wget https://raw.githubusercontent.com/sbc-fish/sfpi/master/u-boot/v2018.11-rc3/.config

        Wenn wir die entsprechende Version von .config nicht bereitstellen, können Sie eine .config mit einer engeren Version finden und zur Verwendung herunterladen. Wenn einige Konfigurationen geändert werden müssen, werden Sie beim anschließenden Kompilieren entsprechend aufgefordert. Sie können die Standardparameter verwenden.

        Wenn Sie die Konfiguration selbst anpassen möchten:

$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- menuconfig

        Dabei ist CROSS_COMPILE das Präfix Ihrer installierten Cross-Compilation-Toolchain. Wenn Sie die von uns bereitgestellte .config verwenden, sollten keine Änderungen erforderlich sein.

4. U-Boot kompilieren

        Beginnen Sie dann mit dem Kompilieren:

$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j24

        die  -j24 entsprechend der CPU Ihrer Maschine angepasst wird. An dieser Stelle sollten Sie eine  u-boot-sunxi-with-spl.bin Datei im aktuellen Verzeichnis erhalten.

5. In U-Boot flashen

        Partition

        Es wird empfohlen, die Partitionstabelle im MBR-Format auf die TF-Karte zu schreiben und vor der ersten Partition einen bestimmten Speicherplatz zu reservieren. Wenn die Dateigröße, die wir im vorherigen Schritt kompiliert haben, einige hundert KB beträgt, lautet ein Partitionierungsschema als Referenz:

Disk: /dev/disk4        geometry: 980/128/63 [7907328 sectors]
Offset: 0       Signature: 0xAA55
         Starting       Ending
 #: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
 1: 0B 1023 254  63 - 1023 254  63 [      2048 -      20480] Win95 FAT-32
 2: 83 1023 254  63 - 1023 254  63 [     22528 -    7884800] Linux files*
 3: 00    0   0   0 -    0   0   0 [         0 -          0] unused
 4: 00    0   0   0 -    0   0   0 [         0 -          0] unused

        Die erste Partition (FAT-32) beginnt ab dem 2048. Sektor, also bei 1M (2048*512=1M), damit genug Platz für U-Boot reserviert ist. Die Größe dieses reservierten Speicherplatzes kann entsprechend den kompilierten  u-boot-sunxi-with-spl.bin Dateien und der Kapazität der TF-Karte angepasst werden. Informationen zur Verwendung von Partitionierungswerkzeugen finden Sie unter  Partitioning - Archlinux Wiki  ,  fdisk - Archlinux Wiki  oder  fdisk Manpages  .

        Verwenden Sie DD, um U-Boot zu flashen

        Schreiben Sie in  u-boot-sunxi-with-spl.bin den 8192-Offset der TF-Karte, der Befehl lautet wie folgt:

$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/disk4 bs=1024 seek=8

        Wenn Sie ein macOS-Benutzer sind, können Sie die  von uns geschriebene flash_uboot_macOS.sh verwenden  .

6. Starten

        serielle Schnittstelle anschließen

        Stecken Sie die TF-Karte in die Pastete mit gesalzenem Fisch, schließen Sie den microUSB an den Computer an und Sie sollten ein USB-zu-Seriell-Gerät sehen. Die Treiber jeder Plattform können von Qinhengs offizieller Website heruntergeladen werden . Unter Windows können Sie Tools wie den Serial Port Assistant verwenden, unter Linux und macOS folgende Befehle:

$ screen [tty] 115200

        Überprüfen Sie die serielle Schnittstelle. Für macOS sollte das tty hier das Format /dev/tty.wchusbserial* haben.

        Drücken Sie die Einschalttaste auf der Platine. Wenn die Konfiguration erfolgreich ist, sollten Sie den U-Boot-Start wie folgt sehen können:

U-Boot SPL 2018.11-rc3 (Nov 09 2018 - 11:55:32 +0800)
DRAM: 64 MiB
Trying to boot from MMC1


U-Boot 2018.11-rc3 (Nov 09 2018 - 11:55:32 +0800) Allwinner Technology

CPU:   Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM:  64 MiB
MMC:   SUNXI SD/MMC: 0
Loading Environment from FAT... OK
In:    serial@01c28000
Out:   serial@01c28000
Err:   serial@01c28000
Net:   No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot:  0
=>

        An dieser Stelle können wir mit dem nächsten Schritt des Linux-Kernel-Kompilierungsprozesses fortfahren.

5. Kompilierung des Linux-Kernels

1. Laden Sie den Linux-Quellcode herunter und wenden Sie den Patch an

        Wir   pflegen einen Patch für den Linux-Mainline-Kernel unter sbc-fish/sfpi:/linux . Es bietet DTS, Standard  .config und einige andere geringfügige Änderungen für Geräte mit gesalzenem Fischkuchen. Die derzeit unterstützten Kernel-Versionen finden Sie unter dem obigen Link. Andere Kernel-Versionen können gemäß dem Patch der nächstliegenden Kernel-Version geändert werden.

        Laden Sie den Linux-Kernel-Quellcode herunter, nehmen Sie 4.19.1 als Beispiel:

$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.1.tar.xz
$ tar xvf linux-4.19.1.tar.xz
$ cd linux-4.19.1

        Wenden Sie die von uns bereitgestellten Patches an:

$ curl https://raw.githubusercontent.com/sbc-fish/sfpi/master/linux/4.19.1/sfpi-linux-4.19.1.patch | patch -p1
patching file arch/arm/boot/dts/Makefile
patching file arch/arm/boot/dts/sun8i-v3s-saltedfishpi.dts
patching file arch/arm/boot/dts/sun8i-v3s.dtsi
patching file arch/arm/configs/saltedfishpi_defconfig
patching file drivers/bluetooth/Kconfig
patching file drivers/bluetooth/hci_h5.c

2. Besorgen Sie sich die Cross-Compilation-Toolchain

        Wenn Sie den relevanten Teil in [Compiling and Flashing U-Boot] (https://sbc-fish.github.io/sfpi/uboot/) gelesen haben, können Sie diesen Abschnitt überspringen.

        Wenn Sie ein Archlinux-Benutzer sind, können Sie  arm-none-eabi-gcc direkt installieren  :

$ sudo pacman -Sy arm-none-eabi-gcc

        Wenn Sie ein Debian-Benutzer sind, können Sie  gcc-arm-linux-gnueabihf installieren  :

$ sudo apt install gcc-arm-linux-gnueabihf

        Wenn Sie ein Ubuntu-Benutzer sind, können Sie  gcc-arm-linux-gnueabihf installieren

$ sudo apt-get install gcc-arm-linux-gnueabihf

        Wenn Sie ein Fedora-Benutzer sind, können Sie  arm-none-eabi-gcc-cs installieren

$ sudo dnf install arm-none-eabi-gcc-cs

        Für nicht aufgeführte Linux-Distributionen können Sie deren Quellen nach einer Cross-Compilation-Toolchain durchsuchen oder  Linaro GCC verwenden, falls nicht .

        Aufgrund der unterschiedlichen Präfixe der Cross-Compiler, die in jeder Version installiert sind, ist das CROSS_COMPILE, das wir später verwenden werden, arm-none-eabi-, wenn der installierte Compiler arm-none-eabi-gcc ist, das heißt, entfernen Sie den letzten gcc-Teil . Andere gebräuchliche sind arm-linux-gnueabihf- und arm-linux-gnueabi, beide sind in Ordnung.

3. Generieren und ändern Sie die Linux-.config

        Verwenden Sie die von uns bereitgestellte .config

        In dem gerade angewendeten Patch ist bereits eine getestete .config enthalten, geben Sie folgenden Befehl ein:

$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- saltedfishpi_defconfig

        Wenn Sie die Konfiguration selbst anpassen möchten:

$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- menuconfig

4. Kompilieren Sie den Linux-Kernel

        Kompilieren Sie den Linux-Kernel mit dem folgenden Befehl:

$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j4

        Die Dauer zum Kompilieren von Linux hängt von der Hardware Ihres Computers ab, und die Parameter werden entsprechend der Anzahl der CPU-Threads angepasst  -j . Könnte genauso gut eine Tasse Kaffee trinken, während Sie darauf warten, dass Linux kompiliert wird.

        Nach dem Kompilieren sollten   wir die gewünschte Summendatei arch/arm/boot/zImage erhalten  .arch/arm/boot/dts/sun8i-v3s-saltedfishpi.dtb

5. Auf TF-Karte schreiben

        Kopieren Sie die kompilierten  Dateien arch/arm/boot/zImage und  arch/arm/boot/dts/sun8i-v3s-saltedfishpi.dtb Dateien in das Dateisystem der TF-Karte. Es wird empfohlen, in das FAT- oder EXT-Dateisystem zu schreiben.

6. Bereiten Sie rootfs vor

        Ein Kernel allein reicht nicht, wir brauchen auch ein rootfs. Die gängigen Methoden sind buildroot und die direkte Nutzung des Images der vorhandenen Distributionsversion Hier nehmen wir als Beispiel ArchLinuxARM, vorausgesetzt, dass dort die erwartete rootfs-Partition gemountet wurde  mnt :

$ wget http://os.archlinuxarm.org/os/ArchLinuxARM-armv7-latest.tar.gz
$ bsdtar -xpf ArchLinuxARM-armv7-latest.tar.gz -C mnt

        Wenn Sie macOS verwenden und nicht in das EXT4-Dateisystem schreiben können, können Sie zuerst einen Linux-Computer finden und Folgendes tun:

$ dd if=/dev/zero of=archlinuxarm.img bs=1M count=1024
$ mkfs.ext4 archlinuxarm.img
$ sudo mount -o loop archlinuxarm.img mnt
$ wget http://os.archlinuxarm.org/os/ArchLinuxARM-armv7-latest.tar.gz
$ bsdtar -xpf ArchLinuxARM-armv7-latest.tar.gz -C mnt
$ sudo umount mnt

        Kopieren Sie die erhaltene  archlinuxarm.img auf das macOS-System und schreiben Sie dann:

$ sudo dd if=archlinuxarm.img of=/dev/[disk] bs=65535

 Die entsprechenden Partitionen [disk] finden  Sie         hier  . diskutil listFür eine bessere Leistung können Sie vor dem Gerätenamen eins hinzufügen  r , z  . B. /dev/rdisk4s2 .

        Wenn Sie e2fsprogs ( ) auf macOS installiert haben brew install e2fsprogs, können Sie das Dateisystem auf die volle Größe der Partition erweitern:

$ sudo /usr/local/opt/e2fsprogs/sbin/resize2fs -p /dev/[disk]

        Die  [disk] Bedeutung ist hier die gleiche wie oben.

7. Konfigurieren Sie U-Boot-Startoptionen

        Im vorherigen Abschnitt sollten Sie in der Lage gewesen sein, die U-Boot-Oberfläche aufzurufen. Zuerst müssen wir den Kernel und die  .dtb gerade erstellten Dateien finden. Sehen Sie sich die Partitionstabelle der TF-Karte an:

=> part list mmc 0

Partition Map for MMC device 0  --   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
  1     8192            85045           68db6199-01     0c
  2     94208           30453760        68db6199-02     83
=>

        Hier sehen Sie den Partitionsstatus auf der TF-Karte. Hier ist ein Beispiel: Eine FAT-Partition enthält den Kernel und die  .dtb Dateien, und eine andere EXT4-Partition enthält die Rootfs. Geben Sie den folgenden Befehl ein, um zu bestätigen, wo der Kernel gespeichert ist:

=> fatls mmc 0:1 # 浏览分区 1 (FAT 文件系统)上的文件
=> ext4ls mmc 0:2 # 浏览分区 2 (EXT4 文件系统)上的文件

        In diesem Tutorial werden die erforderlichen Dateien   in der ersten Partition (FAT-Dateisystem) abgelegt zImage . sun8i-v3s-saltedfishpi.dtbGeben Sie den folgenden Befehl ein, um den Kernel und die  .dtb Dateien in den Speicher zu laden:

=> fatload mmc 0:1 0x41000000 zImage
=> fatload mmc 0:1 0x41800000 sun8i-v3s-saltedfishpi.dtb

        Wenn es sich um ein EXT4-Dateisystem handelt, kann  der obige  Befehl verwendet ext2load oder  ext4load ersetzt  werden. fatloadBeginnen Sie nun mit dem Booten in den Kernel:

=> setenv bootargs console=ttyS0,115200
=> bootz 0x41000000 - 0x41800000

        An diesem Punkt sollten Sie sehen, dass der Linux-Kernel erfolgreich gebootet wurde, der Bootvorgang jedoch nicht abgeschlossen werden konnte, da das rootfs nicht gefunden wurde. Im obigen Beispiel befindet sich das rootfs in der zweiten Partition der TF-Karte, sodass Sie die Boot-Parameter ändern und den Kernel eingeben können:

=> fatload mmc 0:1 0x41000000 zImage
=> fatload mmc 0:1 0x41800000 sun8i-v3s-saltedfishpi.dtb
=> setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rw rootwait
=> bootz 0x41000000 - 0x41800000

        Es ist zu beachten, dass die hier  rootwait hinzugefügt werden muss und sie auch  /dev/mmcblk0p2 die zweite Partition auf der TF-Karte darstellt. Wenn gerade rootfs nicht angegeben wurde, gibt der Kernel die folgenden Informationen aus:

[    2.252872] Please append a correct "root=" boot option; here are the available partitions:
[    2.261315] b300        15273984 mmcblk0
[    2.261320]  driver: mmcblk
[    2.268156]   b301           42522 mmcblk0p1 68db6199-01
[    2.268159]
[    2.274971]   b302        15226880 mmcblk0p2 68db6199-02
[    2.274974]

mmcblk0p2 Sie können die entsprechenden rootfs gemäß den hier angezeigten Informationen         finden und  ändern.

        Wenn Sie den Startbefehl speichern möchten, damit er später automatisch gestartet werden kann, geben Sie den folgenden Befehl ein:

=> setenv bootcmd 'fatload mmc 0:1 0x41000000 zImage;fatload mmc 0:1 0x41800000 sun8i-v3s-saltedfishpi.dtb; setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rw rootwait; bootz 0x41000000 - 0x41800000'
=> saveenv

        Nach jedem Einschalten bootet U-Boot automatisch in Linux. boot Sie können Linux auch manuell eingeben  .

Supongo que te gusta

Origin blog.csdn.net/bashendixie5/article/details/127204051
Recomendado
Clasificación