2010-01-18 5 views
9

Je me demande simplement comment créer un programme autonome en C++?Comment créer un programme C++ autonome?

Editer: Par «autonome», je veux dire un programme qui ne fonctionne pas dans un environnement hébergé (par exemple, un système d'exploitation). Je veux que mon programme soit le premier programme que l'ordinateur charge, au lieu du système d'exploitation.

+2

Définir "indépendant". Vous voulez dire aucune dépendance vis-à-vis des bibliothèques externes? Pour quel système d'exploitation et environnement? –

+0

Autonome comme dans? Pas de système d'exploitation? Pas de bibliothèques dynamiques? –

+0

@Josh Kelley: Par «autonome», je veux dire un programme qui est fondamentalement le premier programme chargé sur un ordinateur (par exemple le système d'exploitation). Je sais que la plupart des gens écrivent un boot-strapper dans ASM mais je me demandais s'il était possible de le faire en C++. –

Répondre

10

Jetez un oeil à cet article:

http://www.codeproject.com/KB/tips/boot-loader.aspx

Vous auriez besoin d'un petit assemblage de code de démarrage pour vous aller aussi loin que principale(), mais alors vous pouvez écrire le reste en C++. Vous devrez écrire votre propre gestionnaire de tas (new/delete) si vous voulez créer des objets à l'exécution et votre propre planificateur si vous voulez plus d'un thread.

2

Même avec votre clarification, la réponse est que cela dépend - la séquence de démarrage exacte dépend du matériel - bien qu'il y ait pas mal de points communs. Le chargeur de démarrage est généralement chargé à une adresse absolue, et le fichier dans lequel il est contenu est fréquemment lu dans la mémoire exactement tel quel. Cela signifie qu'à la place d'un éditeur de liens normal, vous utilisez généralement un "localisateur de liens". Lorsqu'un éditeur de liens typique produit un fichier exécutable prêt à être déplacé et chargé, un localisateur produit un exécutable déjà configuré pour s'exécuter à une adresse exacte, toutes les relocalisations étant déjà appliquées. Pour ceux qui sont assez vieux pour s'en souvenir, c'est typiquement un peu comme un fichier .COM MS-DOS. Parallèlement à cela, il doit (bien sûr) lier statiquement toute l'exécution dont dépend le programme - il ne peut pas dépendre de quelque chose comme une DLL ou une bibliothèque d'objets partagés, car le code à charger soit de ceux-ci n'a pas encore été chargé.

2

google « intégré C++ » pour un démarrage

Une autre idée est de commencer avec les émulateurs de systèmes embarqués, par exemple le site ATMEL a une belle IDE les émule atmel systèmes AVR, et vous permet de construire code brut en C et le charger dans un CPU émulé, ils utilisent gcc comme toolchain (je pense)

2

C++ est utilisé dans embedded systems programming, même pour écrire des noyaux OS.

Habituellement, vous avez au moins quelques instructions de l'assembleur au début de la séquence de démarrage. Quelques choses sont plus faciles à exprimer de cette façon, ou il peut y avoir un code de référence du fournisseur de CPU que vous devez utiliser.

Pour le processus de démarrage initial, vous ne pourrez pas utiliser la bibliothèque standard. Aucune exception, RTII, nouveau/supprimer. Il est de retour à "C avec des classes". La plupart des gens utilisent simplement C ici.

Une fois que vous avez chargé assez d'infrastructure de support, vous pouvez utiliser toutes les parties de la bibliothèque standard que vous pouvez porter.

2

Vous aurez besoin d'un environnement qui fournit:

  • Une bibliothèque C de travail, ou assez pour faire ce que vous voulez
  • Les parties du runtime C++ que vous avez l'intention d'utiliser. Ceci est spécifique au compilateur

En plus de toutes les autres bibliothèques. Si vous n'avez pas de lieur dynamique sur votre plate-forme (si vous n'avez pas de système d'exploitation, vous n'avez probablement pas de lieur), vous devrez tout relier statique.

En pratique, cela signifie que vous devez relier un petit runtime C++ et une bibliothèque C appropriée à votre plate-forme. Ensuite, vous pouvez simplement écrire un programme C++ autonome.

0

Si vous utilisiez BSD Unix, vous lieriez avec la bibliothèque autonome. Cela comprenait un système d'E/S de base pour le disque et le tty. Votre code source ressemblait à celui d'Unix, mais le binaire pouvait être chargé sur une machine nue.

5

Voir cette page: http://wiki.osdev.org/C++

Il a tout le nécessaire pour commencer à écrire un OS en utilisant C++ comme langage de base à l'aide des chaînes d'outils les plus populaires. En outre, cette page devrait s'avérer très utile: http://wiki.osdev.org/C++_Bare_Bones. Il vous permet de vous rendre au point d'entrée C++ d'un système d'exploitation.

Questions connexes