J'ai déjà trouvé les tutoriels Baking Pi , mais ils utilisent uniquement le langage d'assemblage . J'ai suivi les premières leçons, mais je me demande déjà comment utiliser C à la place. Je veux dire, il y a une raison pour laquelle ils ont inventé des langages de niveau supérieur. J'ai essayé de compiler le code C dans un .o
fichier object ( ), en compilant
.section .init
.globl _start
_start:
bl main
loop$:
b loop$
à un autre fichier objet et les reliant entre eux et ainsi obtenir kernel.img
. J'ai ensuite remplacé le noyau déjà présent par le mien, mais il n'exécute pas le code C. Le code C que j'ai écrit devrait simplement allumer la LED OK puis revenir (puis vient loop$: b loop$
). Mais la LED OK clignote plusieurs fois au hasard, puis reste éteinte. Voici mon code C:
int main(int argc, char ** argv) {
volatile unsigned *gpioAddr = (volatile unsigned *)0x20200000;
*(gpioAddr + 4) = 1 << 18;
*(gpioAddr + 40) = 1 << 16;
return 0;
}
Comment utiliser C pour le développement de systèmes d'exploitation sur un Raspberry Pi?
Je doute que ce soit une erreur dans le code (même si je ne suis qu'un amateur). Je suis conscient que la configuration de C peut être compliquée, mais je ne suis pas le premier à le faire. AFAIK, tous les OS actuellement dominants sont principalement écrits en C, il doit donc y avoir un article expliquant le processus. Je serais également très heureux d'avoir une liste d'étapes, je peux donc rechercher ces étapes sur Google et peut-être poser une question un peu moins large.
Remarque: l'équivalent d'assemblage ARM du code C ci-dessus fonctionne très bien. Il allume la LED (après un peu de clignotement). Je pense (j'espère) que cela indique que mon Raspberry Pi va bien.
la source
Réponses:
J'ai écrit un noyau très simple il y a des années et je l'ai exécuté sur un 386. Je n'ai pas fait de programmation bare metal depuis des années, mais en termes généraux, vous devez écrire du code assembleur qui:
La configuration de la pile est facile - trouvez de la mémoire qui n'est pas utilisée et chargez cette adresse dans laquelle le registre est utilisé comme pointeur de pile.
Dans votre code C, vous devez initialiser les structures de données du système d'exploitation comme les pools de mémoire et les tables de threads. Vous ne pourrez pas utiliser les fonctions de la bibliothèque C - vous devrez écrire ce truc vous-même.
Si vous souhaitez écrire un système d'exploitation multitâche simple, vous devrez écrire des routines d'assembleur pour enregistrer les registres du processeur sur la pile et charger un ensemble différent de valeurs de registre à partir de la pile d'un autre thread. Et vous devrez écrire une API pour créer différents threads.
la source
Je n'ai pas examiné votre code en profondeur, mais il me semble que vous êtes sur la bonne voie. Sois sûr que:
_start
symbole est en effet celui utilisé lors de la compilation et de la liaison de votre fichier d'assemblage et de votre fichier C (et quimain()
n'est pas utilisé à la place)main()
, vous devez utiliser la convention d'appel C:return
instruction en C)int main() { ... }
objdump -S main.o
) et regardez comment elle manipule la pile.loop$
.Le wiki OSDev sera une ressource très utile - il concerne principalement le développement x86 mais la plupart des informations sont toujours applicables au raspberry pi.
Quelques ressources spécifiques à Raspberry-Pi OSDEV:
kernel.img
coups de pied.kernel.img
soit exécuté.la source
Le principal problème que vous pourriez rencontrer est les bibliothèques C et le code de prologue. Cela a commencé avant que votre propre code commence à s'exécuter et configure la pile, le tas et fait beaucoup d'autres choses utiles. Cependant, lorsque vous essayez de programmer pour du métal nu, vous n'avez aucun système d'exploitation en dessous de vous et vous feriez mieux d'éviter d'appeler ces fonctions. Pour ce faire, vous avez besoin de versions modifiées des bibliothèques C et / ou de certains symboles globaux définis ou remplacés par les vôtres. Ce processus est un peu compliqué, c'est pourquoi les gens de 'Baking Pi' ont choisi d'utiliser l'assemblage pour leurs tutoriels.
la source
Essayez plutôt ceci:
http://www.valvers.com/open-software/raspberry-pi/step01-bare-metal-programming-in-cpt1/
De plus, l'expérience x86 est un peu différente. Il peut s'appliquer à la programmation générale du système d'exploitation ARM bare metal. Mais pour Pi, désolé c'est le démarrage du GPU en premier et mis en place un peu avant votre code OS (?).
la source
s-matyukevich/raspberry-pi-os
https://github.com/s-matyukevich/raspberry-pi-os
Ce repo génial fait à la fois le bootstraping C et aborde des sujets assez complexes.
De plus, il examine comment le noyau Linux fait les choses et annote le code du noyau Linux.
Jetez un œil au premier tutoriel pour une configuration minimaliste: https://github.com/s-matyukevich/raspberry-pi-os/tree/43f682d406c8fc08736ca3edd08a1c8e477c72b0/src/lesson01/src
Je le recommande fortement.
la source