Lesen Sie das Booten von ARM Linux erneut

Lesen Sie Bootring ARM Linux erneut

Dieses Mal werde ich Bootring ARM Linux erneut lesen, um erneut zu erkennen, was beim Startvorgang von ARM Linux geschieht.

(Ergänzung) Ursprünglich ist es Teil des Quellcodes des Linux-Kernels, daher wird es als GPLv2 (Erkennung) behandelt.

https://www.kernel.org/doc/html/latest/index.html

Licensing documentation

The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.

https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing

Lass es uns lesen.

https://www.kernel.org/doc/html/latest/arm/booting.html#

In order to boot ARM Linux, you require a boot loader, which is a small program that runs before the main kernel. The boot loader is expected to initialise various devices, and eventually call the Linux kernel, passing information to the kernel.

Zum Booten von ARM Linux ist ein Bootloader erforderlich. Bootloader ist ein kleines Programm, das vor dem Booten des Hauptkernels ausgeführt wird. Der Bootloader initialisiert verschiedene Geräte und gibt schließlich Informationen an den Kernel weiter, um den Linux-Kernel aufzurufen.

Essentially, the boot loader should provide (as a minimum) the following: 1.Setup and initialise the RAM. 2.Initialise one serial port. 3.Detect the machine type. 4.Setup the kernel tagged list. 5.Load initramfs. 6.Call the kernel image.

Im Wesentlichen führt der Bootloder Folgendes aus (als Mindestkonfiguration):

  1. RAM-Setup und Initialisierung

  2. Initialisieren Sie eine serielle Schnittstelle.

  3. Identifizierung des Maschinentyps

  4. Einrichten der Kernel-Tag-Liste

  5. Einladung von initramfs

  6. Rufen Sie das Kernel-Image auf.

  7. Setup and initialise RAM

Existing boot loaders: OBLIGATORISCH (erforderlich) New boot loaders: OBLIGATORISCH (erforderlich)

The boot loader is expected to find and initialise all RAM that the kernel will use for volatile data storage in the system. It performs this in a machine dependent manner. (It may use internal algorithms to automatically locate and size all RAM, or it may use knowledge of the RAM in the machine, or any other method the boot loader designer sees fit.)

Der Bootloader erkennt und initialisiert den gesamten RAM, den der Kernel als temporären Datenspeicher im System verwendet. Dies ist ein maschinenabhängiger Ansatz. (Möglicherweise werden automatisch der Speicherort und die Kapazität des gesamten Arbeitsspeichers, die Kenntnis des Arbeitsspeichers auf dem Computer oder ein anderer interner Algorithmus verwendet, der zum Bootloader-Designer passt.)

  1. Initialise one serial port

Existing boot loaders: OPTIONAL, EMPFOHLEN (optional und empfohlen) New boot loaders: OPTIONAL, EMPFOHLEN (optional und empfohlen)

The boot loader should initialise and enable one serial port on the target. This allows the kernel serial driver to automatically detect which serial port it should use for the kernel console (generally used for debugging purposes, or communication with the target.)

Der Bootloader sollte eine serielle Schnittstelle am Ziel initialisieren und aktivieren. Dies wird vom seriellen Kerneltreiber verwendet, um den von der Kernelkonsole verwendeten seriellen Port automatisch zu erkennen (im Allgemeinen für Debugging-Zwecke oder für die Kommunikation mit dem Ziel).

As an alternative, the boot loader can pass the relevant ‘console=’ option to the kernel via the tagged lists specifying the port, and serial format options as described in

Alternativ kann der Bootloader den Kernel über eine markierte Liste für den Port über die entsprechende Option "console =" informieren. Details zur Option für das serielle Format finden Sie unten.

Documentation/admin-guide/kernel-parameters.rst.

  1. Detect the machine type

Existing boot loaders: OPTIONAL New boot loaders: OBLIGATORISCH, außer für Nur-DT-Plattformen (wahrscheinlich für Nur-DT-Plattformen erforderlich)

The boot loader should detect the machine type its running on by some method. Whether this is a hard coded value or some algorithm that looks at the connected hardware is beyond the scope of this document. The boot loader must ultimately be able to provide a MACH_TYPE_xxx value to the kernel. (see linux/arch/arm/tools/mach-types). This should be passed to the kernel in register r1.

Der Bootloader sollte den Maschinentyp erkennen, der auf irgendeine Weise betrieben wird. Die Verwendung fest codierter Werte oder das Lesen der angeschlossenen Hardware und die Verwendung eines Algorithmus usw. liegen außerhalb des Geltungsbereichs dieses Dokuments. Der Bootloader sollte eventuell in der Lage sein, den Kernel über den Wert MACH_TYPE_xxx zu benachrichtigen (siehe linux / arch / arm / tools / mach-types). Dies wird dem Kernel über das Register r1 mitgeteilt.

For DT-only platforms, the machine type will be determined by device tree. set the machine type to all ones (~0). This is not strictly necessary, but assures that it will not match any existing types.

In einem Nur-DT-Plaftorm wird der Maschinentyp verwendet, um den Gerätebaum zu bestimmen. Der Maschinentyp ist auf alle 1s (~ 0) eingestellt. Dies ist nicht unbedingt erforderlich, garantiert jedoch, dass es nicht mit vorhandenen Typen übereinstimmt.

  1. Setup boot data Existing boot loaders: OPTIONAL, SEHR EMPFOHLEN (optional, aber sehr zu empfehlen) New boot loaders: OBLIGATORISCH (erforderlich)

The boot loader must provide either a tagged list or a dtb image for passing configuration data to the kernel. The physical address of the boot data is passed to the kernel in register r2.

Der Bootloader muss entweder eine markierte Liste oder ein dtb-Image als Konfigurationsdaten für den Kernel bereitstellen. Die physikalische Adresse der Startdaten wird dem Kernel über das Register r2 mitgeteilt.

4a. Setup the kernel tagged list

The boot loader must create and initialise the kernel tagged list. A valid tagged list starts with ATAG_CORE and ends with ATAG_NONE. The ATAG_CORE tag may or may not be empty. An empty ATAG_CORE tag has the size field set to ‘2’ (0x00000002). The ATAG_NONE must set the size field to zero.

Der Bootloader muss eine mit Kernel-Tags versehene Liste erstellen und initialisieren. Eine gültige getaggte Liste endet bei ATAG_NONE über ATAG_CORE. Das Tag ATAG_CORE kann sein oder nicht. Ein leeres ATAG_CORE-Tag wird mit einem Größenfeld von '2' (0x00000002) festgelegt. ATAG_NONE muss eine Größe von 0 haben.

Any number of tags can be placed in the list. It is undefined whether a repeated tag appends to the information carried by the previous tag, or whether it replaces the information in its entirety; some tags behave as the former, others the latter.

Einige Zahlen in Tags können in einer Liste gespeichert werden. Wenn ein Tag wiederholt wird, ist nicht definiert, ob es zu den vom vorherigen Tag wahrgenommenen Informationen hinzugefügt oder die gesamten Informationen ersetzt werden. Einige Tags fungieren als erstere, während andere als letztere fungieren.

The boot loader must pass at a minimum the size and location of the system memory, and root filesystem location. Therefore, the minimum tagged list should look:

Der Bootloader muss mindestens Informationen über die Größe und den Speicherort des Systemspeichers und den Speicherort des Root-Dateisystems übermitteln. Die Liste der minimalen Tags lautet wie folgt.

              +-----------+
base ->       | ATAG_CORE |  |
              +-----------+  |
              | ATAG_MEM  |  | increasing address
              +-----------+  |
              | ATAG_NONE |  |
              +-----------+  v

The tagged list should be stored in system RAM. Die markierte Liste wird im System-RAM gespeichert.

The tagged list must be placed in a region of memory where neither the kernel decompressor nor initrd ‘bootp’ program will overwrite it. The recommended placement is in the first 16KiB of RAM.

Die mit Tags versehene Liste muss in einem Speicherbereich abgelegt werden, der den Kernel-Dekomprimierer oder das initrd-Bootgor-Programm nicht überschreibt. Der empfohlene Speicherort sind die ersten 16 KB Speicher.

4b. Setup the device tree

The boot loader must load a device tree image (dtb) into system ram at a 64bit aligned address and initialize it with the boot data. The dtb format is documented in Documentation/devicetree/booting-without-of.txt. The kernel will look for the dtb magic value of 0xd00dfeed at the dtb physical address to determine if a dtb has been passed instead of a tagged list.

Der Bootloader muss das Gerätebaum-Image (dtb) in die 64-Bit-Ausrichtungsadresse im System-RAM laden und die Bootdaten initialisieren. Das drb-Format ist in Documentation / devicetree / booting-without-of.txt dokumentiert. Der Kernel verwendet dtb anstelle der markierten Liste, indem er den magischen dtb-Wert 0xd00dfeed aus der physischen drb-Adresse ermittelt.

The boot loader must pass at a minimum the size and location of the system memory, and the root filesystem location. The dtb must be placed in a region of memory where the kernel decompressor will not overwrite it, while remaining within the region which will be covered by the kernel’s low-memory mapping.

Der Bootloader überträgt minimale Informationen wie Größe und Speicherort des Systemspeichers und Speicherort des Root-Dateisystems. dtb muss in einem Speicherbereich platziert werden, der vom Kernel-Dekomprimierer nicht überschrieben wird. Und es sollte sich innerhalb des Bereichs befinden, der von der Zuordnung des Kernels zu wenig Speicher u abgedeckt wird.

A safe location is just above the 128MiB boundary from start of RAM.

Der Bereich bis zur ersten 128-Mib-Grenze des RAM ist eine sichere Position.

  1. Load initramfs.

Existing boot loaders: OPTIONAL New boot loaders: OPTIONAL

If an initramfs is in use then, as with the dtb, it must be placed in a region of memory where the kernel decompressor will not overwrite it while also with the region which will be covered by the kernel’s low-memory mapping.

Wenn Sie initramfs mit dtb verwenden, muss es in einem Speicherbereich installiert werden, den der Kernel de Compressor nicht überschreibt. Und es sollte sich innerhalb des Bereichs befinden, der von der Zuordnung des Kernels zu wenig Speicher u abgedeckt wird.

A safe location is just above the device tree blob which itself will be loaded just above the 128MiB boundary from the start of RAM as recommended above.

Der sichere Ort befindet sich direkt über dem Gerätebaum. Der Gerätebaum-Blob wird wie oben empfohlen direkt über dem 128-MB-Bereich ab dem Anfang des RAM geladen.

  1. Calling the kernel image

Existing boot loaders: OBLIGATORISCH (erforderlich) New boot loaders: OBLIGATORISCH (erforderlich)

There are two options for calling the kernel zImage. If the zImage is stored in flash, and is linked correctly to be run from flash, then it is legal for the boot loader to call the zImage in flash directly.

Es gibt zwei Möglichkeiten, den Kernel zImage aufzurufen. Wenn das zImage in Flash gespeichert ist und ordnungsgemäß mit der Arbeit über Flash verknüpft ist, kann der Bootloader zImage direkt aus Flash heraus aufrufen.

The zImage may also be placed in system RAM and called there. The kernel should be placed in the first 128MiB of RAM. It is recommended that it is loaded above 32MiB in order to avoid the need to relocate prior to decompression, which will make the boot process slightly faster.

zImage befindet sich ebenfalls im System-RAM und kann von dort aus aufgerufen werden. Der Kernel sollte sich am Anfang von RAM 128MiB befinden. Es wird empfohlen, es über 32 MB zu laden, damit es nach der Bereitstellung nicht verschoben werden muss. Dies beschleunigt den Startvorgang etwas.

When booting a raw (non-zImage) kernel the constraints are tighter. In this case the kernel must be loaded at an offset into system equal to TEXT_OFFSET - PAGE_OFFSET.

Die Einschränkungen sind beim Booten des RAM-Kernels (nicht zImage) noch strenger. In diesem Fall muss der Kernel den Kernel mit einem Offset laden, der TEXT_OFFSET --PAGE_OFFSET entspricht.

In any case, the following conditions must be met:

In jedem Fall müssen die folgenden Bedingungen erfüllt sein.

・ Stilllegen Sie alle DMA-fähigen Geräte, damit der Speicher nicht durch falsche Netzwerkpakete oder Festplattendaten beschädigt wird. Dies erspart Ihnen viele Stunden Debugging.

Alle DMA-fähigen Geräte müssen gestoppt werden, damit sie keine Netzwerkpakete oder Festplattendaten erhalten. Dies spart Ihnen viel Zeit für das Debuggen.

・ CPU-Registereinstellungen r0 = 0, r1 = machine type number discovered in (3) above. r2 = physical address of tagged list in system RAM, or physical address of device tree block (dtb) in system RAM CPU mode

CPU-Registereinstellung. r0 = 0, r1 = Maschinentyp num, wie in 3 oben erwähnt. r2 = physikalische Adresse der markierten Liste im System-RAM oder im Gerätebaumblock (dtb) im System-RAM-CPU-Modus.

All forms of interrupts must be disabled (IRQs and FIQs)

Alle Interrupts (IRQ / FIQ) müssen deaktiviert sein.

For CPUs which do not include the ARM virtualization extensions, the CPU must be in SVC mode. (A special exception exists for Angel)

Wenn die CPU keine Virtualisierungserweiterungen enthält, befindet sich die CPU im SVC-Modus (Angel hat eine besondere Ausnahme).

CPUs which include support for the virtualization extensions can be entered in HYP mode in order to enable the kernel to make full use of these extensions. This is the recommended boot method for such CPUs, unless the virtualisations are already in use by a pre-installed hypervisor.

Wenn die CPU virtualisierte Erweiterungen enthält, rufen Sie den HYP-Modus auf, um diese Erweiterungen dem Kernel vollständig zur Verfügung zu stellen. Dies ist die empfohlene Startmethode für solche CPUs, es sei denn, die Virtualisierung wird bereits von einem vorinstallierten Hypervisor verwendet.

If the kernel is not entered in HYP mode for any reason, it must be entered in SVC mode.

Wenn der Kernel aus irgendeinem Grund nicht in den HYP-Modus wechselt, muss er in den SVC-Modus wechseln.

・ Caches, MMUs The MMU must be off. Instruction cache may be on or off. Data cache must be off.

・ Cache, MMU MMU muss AUS sein. Der Anweisungscache kann ein oder aus sein. Der Datencache muss ausgeschaltet sein.

If the kernel is entered in HYP mode, the above requirements apply to the HYP mode configuration in addition to the ordinary PL1 (privileged kernel modes) configuration. In addition, all traps into the hypervisor must be disabled, and PL1 access must be granted for all peripherals and CPU resources for which this is architecturally possible.

Wenn der Kernel im HYP-Modus startet, gelten die oben genannten Anforderungen zusätzlich zum normalen PL1 (privilegierter Kernel-Modus) für die Konfiguration des HYP-Modus. Wenn Sie alle Traps für den Hypervisor deaktivieren, muss PL1 für alle Peripheriegeräte und CPU-Ressourcen zugänglich sein, für die die Architektur verfügbar ist.

Except for entering in HYP mode, the system configuration should be such that a kernel which does not include support for the virtualization extensions can boot correctly without extra help.

Außer beim Aufrufen des HYP-Modus muss die Systemkonfiguration ermöglichen, dass Kernel, die keine Unterstützung für Virtualisierungserweiterungen enthalten, ohne besondere Unterstützung ordnungsgemäß gestartet werden.

・ Es wird erwartet, dass der Bootloader das Kernel-Image aufruft, indem er direkt zur ersten Anweisung des Kernel-Images springt.

-Der Bootloader ruft das Kernel-Image auf, indem er direkt zur ersten Anweisung des Kernel-Images springt.

・ Auf CPUs, die den ARM-Befehlssatz unterstützen, muss der Eintrag auch für einen Thumb-2-Kernel im ARM-Status erfolgen.

Solange die CPU den ARM-Befehlssatz unterstützt, können Sie in den ARM-Status wechseln, auch wenn es sich um einen Thumb-2-Kernel handelt.

On CPUs supporting only the Thumb instruction set such as Cortex-M class CPUs, the entry must be made in Thumb state.

CPUs wie die Cortex-M-Klasse, die nur den Thumb-Befehlssatz unterstützen, müssen im Thumb-Status eingegeben werden.

Recommended Posts

Lesen Sie das Booten von ARM Linux erneut
Linux
Führen Sie Linux mit ARM-Architektur mit QEMU aus