Cette fois, je vais relire Bootring ARM Linux afin de reconnaître à nouveau ce qui se passe dans le processus de démarrage d'ARM Linux.
(Ajout) À l'origine, il fait partie du code source du noyau Linux, il sera donc traité comme GPLv2 (reconnaissance).
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
Lisons-le.
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.
Un chargeur de démarrage est nécessaire pour démarrer ARM Linux. boot loader est un petit programme qui s'exécute avant de démarrer le noyau principal. Le chargeur de démarrage initialisera divers périphériques et finira par communiquer des informations au noyau pour appeler le noyau Linux.
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.
En substance, le loder de démarrage effectue les opérations suivantes (configuration minimale):
Configuration et initialisation de la RAM
Initialisez un port série.
Identification du type de machine
Configuration de la liste balisée du noyau
Invitation d'initramfs
Appelez l'image du noyau.
Setup and initialise RAM
Existing boot loaders: OBLIGATOIRE (obligatoire) New boot loaders: OBLIGATOIRE (obligatoire)
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.)
Le chargeur de démarrage détectera et initialisera toute la RAM que le noyau utilise comme stockage de données temporaire dans le système. Il s'agit d'une approche dépendante de la machine. (Peut-être qu'il utilisera automatiquement l'emplacement et la capacité de toute la RAM, la connaissance de la RAM sur la machine ou tout autre algorithme interne adapté au concepteur du chargeur de démarrage).
Existing boot loaders: OPTIONNEL, RECOMMANDÉ (facultatif et recommandé) New boot loaders: OPTIONNEL, RECOMMANDÉ (facultatif et recommandé)
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.)
Le chargeur de démarrage doit initialiser et activer un port série sur la cible. Ceci est utilisé par le pilote série du noyau pour détecter automatiquement le port série utilisé par la console du noyau (généralement utilisé à des fins de débogage ou pour la communication avec la cible).
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
Alternativement, le chargeur de démarrage peut notifier au noyau l'option "console =" appropriée via une liste balisée pour le port. Les détails de l'option de format série sont ci-dessous.
Documentation/admin-guide/kernel-parameters.rst.
Existing boot loaders: OPTIONNEL New boot loaders: OBLIGATOIRE sauf pour les plates-formes DT uniquement (probablement requis pour les plates-formes DT uniquement)
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.
Le chargeur de démarrage doit détecter le type de machine qui fonctionne par certains moyens. L'utilisation de valeurs codées en dur, ou la lecture du matériel connecté et l'utilisation d'un algorithme, etc., n'entre pas dans le cadre de ce document. Le chargeur de démarrage devrait éventuellement pouvoir notifier le noyau de la valeur MACH_TYPE_xxx (voir linux / arch / arm / tools / mach-types). Ceci est notifié au noyau via le registre r1.
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.
Dans la plate-forme DT uniquement, le type de machine est utilisé pour déterminer l'arborescence des périphériques. Le type de machine est réglé sur tous les 1 (~ 0). Ce n'est pas strictement nécessaire, mais cela garantit qu'il ne correspondra pas aux types existants.
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.
Le chargeur de démarrage doit fournir une liste balisée ou une image dtb en tant que données de configuration pour le noyau. L'adresse physique des données de démarrage est notifiée au noyau via le registre r2.
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.
Le chargeur de démarrage doit générer et initialiser une liste balisée du noyau. Une liste balisée valide se termine à ATAG_NONE via ATAG_CORE. La balise ATAG_CORE peut ou non être. Une balise ATAG_CORE vide est définie avec un champ de taille de «2» (0x00000002). ATAG_NONE doit avoir une taille de champ de 0.
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.
Certains numéros des balises peuvent être stockés dans une liste. Lorsqu'une balise est répétée, il n'est pas défini si elle sera ajoutée aux informations perçues par la balise précédente ou remplacera l'ensemble des informations. Certains tags agissent comme les premiers, tandis que d'autres agissent comme les seconds.
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:
Le chargeur de démarrage doit au moins transmettre des informations sur la taille et l'emplacement de la mémoire système et l'emplacement du système de fichiers racine. La liste balisée minimale est la suivante.
+-----------+
base -> | ATAG_CORE | |
+-----------+ |
| ATAG_MEM | | increasing address
+-----------+ |
| ATAG_NONE | |
+-----------+ v
The tagged list should be stored in system RAM. La liste marquée est conservée dans la RAM système.
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.
La liste balisée doit être placée sur une zone mémoire qui n'écrase pas le décompresseur du noyau ou le programme initrd "bootp". L'emplacement recommandé est les 16 premiers Kio de mémoire.
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.
Le chargeur de démarrage doit charger l'image de l'arborescence des périphériques (dtb) dans l'adresse d'alignement 64 bits sur la RAM système et initialiser les données de démarrage. Le format drb est documenté dans Documentation / devicetree / booting-without-of.txt. Le noyau utilise dtb au lieu de la liste balisée en trouvant la valeur magique dtb 0xd00dfeed à partir de l'adresse physique drb.
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.
Le chargeur de démarrage transmet des informations minimales telles que la taille et l'emplacement de la mémoire système et l'emplacement du système de fichiers racine. dtb doit être placé sur une zone mémoire qui ne sera pas écrasée par le décompresseur du noyau. Et il devrait être dans la zone couverte par le mappage de mémoire faible u du noyau.
A safe location is just above the 128MiB boundary from start of RAM.
La zone jusqu'à la première limite de 128 Mo de RAM est une position sûre.
Existing boot loaders: OPTIONNEL New boot loaders: OPTIONNEL
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.
Lorsque vous utilisez initramfs avec dtb, il doit être installé sur une zone mémoire que le noyau de compresseur n'écrase pas. Et il devrait être dans la zone couverte par le mappage de mémoire faible u du noyau.
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.
L'endroit sûr est juste au-dessus de l'arborescence des appareils. L'objet de l'arborescence des périphériques est chargé juste au-dessus de la zone de 128 Mo à partir du début de la RAM, comme recommandé ci-dessus.
Existing boot loaders: OBLIGATOIRE (obligatoire) New boot loaders: OBLIGATOIRE (obligatoire)
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.
Il existe deux façons d'appeler le noyau zImage. Si la zImage est conservée dans Flash et qu'elle est correctement liée pour fonctionner à partir de Flash, le chargeur de démarrage peut appeler zImage directement depuis Flash.
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 est également situé sur la RAM système et peut être appelé à partir de là. Le noyau doit être situé au début de la RAM 128MiB. Et il est recommandé de le charger au-delà de 32 Mo afin qu'il n'ait pas besoin d'être déplacé après le déploiement. Cela rend le processus de démarrage légèrement plus rapide.
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.
Les restrictions sont encore plus strictes lors du démarrage du noyau ram (non-zImage). Dans ce cas, le noyau doit charger le noyau avec un offset égal à TEXT_OFFSET --PAGE_OFFSET.
In any case, the following conditions must be met:
Dans les deux cas, les conditions suivantes doivent être remplies.
・ Mettez au repos tous les périphériques compatibles DMA afin que la mémoire ne soit pas corrompue par de faux paquets réseau ou des données de disque. Cela vous fera économiser de nombreuses heures de débogage.
Tous les périphériques compatibles DMA doivent être arrêtés afin qu'ils n'obtiennent pas de paquets réseau ou de données disque. Cela vous fera gagner beaucoup de temps pour le débogage,
・ Paramètres du registre CPU 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
Réglage du registre du processeur. r0 = 0, r1 = numéro de type de machine mentionné en 3 ci-dessus. r2 = adresse physique de la liste balisée dans la RAM système ou du bloc de l'arborescence des périphériques (dtb) en mode CPU RAM système.
All forms of interrupts must be disabled (IRQs and FIQs)
Toutes les interruptions (IRQ / FIQ) doivent être désactivées.
For CPUs which do not include the ARM virtualization extensions, the CPU must be in SVC mode. (A special exception exists for Angel)
Si le CPU n'inclut pas d'extensions de virtualisation, alors le CPU est en mode SVC (Angel a une exception spéciale)
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.
Si le CPU contient des extensions virtualisées, entrez en mode HYP pour rendre ces extensions entièrement disponibles pour le noyau. Il s'agit de la méthode de démarrage recommandée pour ces processeurs, sauf si la virtualisation est déjà utilisée par un hyperviseur préinstallé.
If the kernel is not entered in HYP mode for any reason, it must be entered in SVC mode.
Si le noyau n'entre pas en mode HYP pour une raison quelconque, il doit passer en mode SVC.
・ Caches, MMU The MMU must be off. Instruction cache may be on or off. Data cache must be off.
・ Cache, MMU MMU doit être désactivé. Le cache d'instructions peut être activé ou désactivé. Le cache de données doit être désactivé.
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.
Si le noyau démarre en mode HYP, les exigences ci-dessus s'appliquent à la configuration du mode HYP en plus du PL1 normal (mode noyau privilégié). De plus, en désactivant tous les traps de l'hyperviseur, PL1 doit être accessible à tous les périphériques et ressources CPU pour lesquels l'architecture est disponible.
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.
Sauf lors du passage en mode HYP, la configuration du système doit permettre aux noyaux qui ne prennent pas en charge les extensions de virtualisation de démarrer correctement sans aucune assistance particulière.
・ Le chargeur de démarrage devrait appeler l'image du noyau en passant directement à la première instruction de l'image du noyau.
-Le chargeur de démarrage appelle l'image du noyau en sautant directement à la première instruction de l'image du noyau.
・ Sur les CPU prenant en charge le jeu d'instructions ARM, l'entrée doit être effectuée dans l'état ARM, même pour un noyau Thumb-2.
Tant que le CPU prend en charge le jeu d'instructions ARM, vous pouvez entrer dans l'état ARM même s'il s'agit d'un noyau Thumb-2.
On CPUs supporting only the Thumb instruction set such as Cortex-M class CPUs, the entry must be made in Thumb state.
Les processeurs comme la classe Cortex-M qui ne prennent en charge que le jeu d'instructions Thumb doivent être entrés dans l'état Thumb.