Comment puis-je trouver Linux ARM point d'entrée quand il ne parvient pas à décompresser?
Je suis en train de démarrer Linux via U-boot sur une carte personnalisé avec j'ai.MX6 (CPU core ARM Cortex A9)
Nous semblent avoir porté Das U-Boot(2009.08) avec succès. Mais le démarrage de Linux ne parvient pas à le dernier U-Boot message: "à Partir du noyau ..."
Voici mon environnement:
bootargs=console=ttymxc1,115200 vmalloc=400M root=/dev/mmcblk0p1 rootwait consoleblank=0 earlyprintk video=mxcfb0:dev=lcd,LCD-ORTUS,if=RGB24 video=mxcfb1:dev=hdmi,1280x720M@60,if=RGB24 calibration tsdev=tsc2004 fbmem=10M,28M
bootcmd=ext2load mmc 0:1 10800000 /boot/uImage ; bootm 10800000
Le démarrage de la production est
Loading file "/boot/uImage" from mmc device 0:1 (xxa1)
4043552 bytes read
## Booting kernel from Legacy Image at 10800000 ...
Image Name: Linux-3.0.35
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4043488 Bytes = 3.9 MB
Load Address: 10008000
Entry Point: 10008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
Quand je objdump le noyau, à l'adresse 80008000, je vois le point d'entrée à arch/arm/kernel/tête.S, et pas arch/arm/boot/comprimé/tête.S
Ce que je vois est, le noyau n'a même pas le décompresser. J'ai essayé d'ajouter certaines registre de manipulation de code de signal GPIOs comprimé/tête.S avec pas de réponse.
Ma question est, comment puis-je m'assurer de U-Boot appelle le bon point d'entrée?
Exactement le même noyau binaire avec succès les bottes de Freescale de référence du conseil d'administration, en utilisant le même U-Boot commandes.
EDIT: j'ai ajouté quelques traces de U-Boot. Juste avant d'appeler le noyau, le pointeur theKernel est 10008000 et pas de 10800000. Est-ce à dire U-boot est de sauter au mauvais endroit?
- Avez-vous des JTAG? Si si, il suffit de le déboguer.
- Je pense que le Noyau va commencer qu'après la décompression, après le démarrage du noyau d'impression, le noyau va sauter à l'entrée du noyau de la fonction u-boot obtient à partir du noyau de l'image d'en-tête. Vous avez copié noyau compressé à partir du support de démarrage de 10800000, bootm commande va décompresser et mettre le noyau sur la bonne adresse de chargement qui est 10008000, 32K limite de la RAM adresse de départ. Si elle n'est pas de démarrer, puis très probablement la raison est l'identifiant de la machine. Je voudrais savoir quelle est la bonne raison?
Vous devez vous connecter pour publier un commentaire.
Il y a des preuves que c'est une mauvaise hypothèse.
La version de U-Boot utilisez-vous?
Dans les deux 2012.10 et 2013.04 versions de U-Boot, la variable
theKernel
est seulement déclarée et utilisée par le code pour se cambre comme AVR32 et MIPS.Il n'y a pas de BRAS de code qui devrait être à l'aide de
theKernel
.Veuillez expliquer comment vous êtes en mesure de tracer une variable qui ne devrait pas être définie ou affecté sur un processeur ARM.
La prochaine sortie après l'U-Boot affiche "Démarrage du noyau ..." doit être "la Décompression Linux...".
Pour la Freescale arc de ce texte de sortie dépend de la bonne transmission de la
machine type number
(akaarch_id
) par U-Boot du noyau.Vous devez vérifier que ce
machine type number
est correctement défini dans U-Boot.Quel est votre fichier de configuration pour U-Boot ressembler?
Avez-vous sanity check ce code pour s'assurer qu'il fonctionne comme prévu?
Avez-vous essayer le GPIO opérations de l'U-Boot la ligne de commande?
Pour le BRAS d'arc, c'est un saut à l'adresse indiquée dans le bootm commande.
Depuis le comme uimage l'adresse de chargement et de la bootm spécifier le même 0x10800000 adresse, ça devrait être bon (en supposant que l'U-Boot est correctement configuré et intégré pour les BRAS).
OUI.
Si vous consultez le code source (pour AVR32 ou MIPS), vous trouveriez que
theKernel
est attribué à partir de l'image d'en-tête, plus précisément le point d'entrée de la valeur. U-Boot serait alors sauter à cet endroit.Mais le vrai problème, c'est que votre ARM Cortex A9 ne doivent pas être à l'aide de ce code ou de cette variable.
Il me semble que si U-Boot n'est pas configuré pour le bon arc et/ou le type de machine peut ne pas être correctement défini.
CORRECTIONS:
Que l'OP a souligné, les anciennes versions de U-Boot fait d'utiliser la variable
theKernel
même pour le BRAS d'arc.La ligne de U-Boot de sortie:
indique que les U-Boot (avec succès) copié l'image du noyau (sans les informations de l'image d'en-tête) de la
bootm
adresse de 0x10800000 (plus de décalage 0x40 pour la longueur d'en-tête) de l'adresse de chargement 0x10008000. Ce mémoire de déplacement est effectué par la procédurebootm_load_os()
dans commune/cmd_bootm.c.De sorte que la valeur de 0x10008000 que vous avez indiqué est correct pour
theKernel
.Il n'y a aucune indication que l'U-Boot est de sauter à l'emplacement incorrect.
Comme déjà mentionné, vous devez vérifier que le type de machine est correctement définie. La valeur devrait être utilisé dans
__arch_decomp_setup()
dans arch/arm/plate-mxc/include/mach/décompresser.h afin que le texte pourrait être de sortie lors de la décompression avant le noyau de l'amorçage.grep
l'ensemble de votre arborescence des sources (noyau et les chargeurs d'amorçage) pour la carte d'origine du type de machine de trouver un code qui doit être mis à jour.Vous ne semblez pas être un démarrage à la vmlinux noyau de fichier de sorte que vous n'avez pas à vous soucier de points d'entrée. La décompression de code au début de l'image, déplacez le noyau, comme l'exige et sauter au bon point d'entrée lors de son fait. Vous avez juste à sauter le début de l'image qui uBoot semble faire correctement.
Je voudrais activer le débogage du noyau, en particulier la earlyprintk et le bas niveau des options de débogage et d'essayer de démarrer à nouveau. Au moins vous obtenez de voir où il l'enfourne jusqu'.
Edit: Comme l'a souligné, ma réponse ne s'applique que si uBoot est en train de faire c'est chose correctement en premier lieu. Dans ce cas, il y a une possibilité qu'il ne l'est pas. Vous pourriez peut-être créer et de tenter de démarrer un crétin "noyau" qui passe simplement sur certains Voyants ou des sorties de certaines valeurs de registre de série (r0, r1 et r2 en particulier). Ensuite, vous pouvez vérifier au moins et/ou le uBoot comme le coupable.
Pourrait-il que le fichier que l'U-Boot est le chargement est en fait l'image binaire de
vmlinux
place le fichier auto-extractiblezImage
/bzImage
? C'est juste une supposition, je ne suis pas un expert sur ce.À cette question, j'ai récemment demandé sur Unix Pile d'Échange pourrait être d'intérêt pour vous: https://unix.stackexchange.com/questions/197225/is-vmlinuz-and-bzimage-really-the-same