J'essaie d'exécuter une application Linux et tout ce que je veux exécuter est cette seule application hors démarrage. J'ai besoin de réseautage et c'est tout (pas d'affichage, de périphériques, etc.). Je ne veux aucune autre application en cours d'exécution afin que l'application que j'exécute ait 100% du CPU. Est-ce possible?
17
Réponses:
Étape par étape du programme minimal initrd CPIO hello world
Compilez un monde bonjour sans aucune dépendance qui se termine par une boucle infinie.
init.S
:On ne peut pas utiliser
sys_exit
, sinon la panique du noyau.Alors:
Cela crée un système de fichiers avec notre monde bonjour
/init
, qui est le premier programme de l'espace utilisateur sur lequel le noyau s'exécutera. Nous aurions également pu ajouter plus de fichiersd/
et ils seraient accessibles depuis le/init
programme lors de l'exécution du noyau.Ensuite,
cd
dans l'arborescence du noyau Linux, la construction est comme d'habitude et exécutez-la dans QEMU:Et vous devriez voir une ligne:
sur l'écran de l'émulateur! Notez que ce n'est pas la dernière ligne, vous devez donc regarder un peu plus haut.
Vous pouvez également utiliser des programmes C si vous les liez statiquement:
avec:
Vous pouvez exécuter sur du vrai matériel avec une clé USB
/dev/sdX
et:Excellente source sur ce sujet: http://landley.net/writing/rootfs-howto.html Il explique également comment utiliser
gen_initramfs_list.sh
, qui est un script de l'arborescence des sources du noyau Linux pour aider à automatiser le processus.Étape suivante: configurez BusyBox pour pouvoir interagir avec le système: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902#203902
Testé sur Ubuntu 16.10, QEMU 2.6.1.
la source
vous pouvez démarrer le noyau avec un
init=/path/to/myapp
paramètre défini dans votre chargeur de démarrage.la source
On dirait que vous essayez de mettre en place un kiosque . La plupart des guides sur Internet se concentrent sur un navigateur Web comme Firefox comme seule application qui s'exécute. Jetez un oeil à ce guide pour des idées.
la source
Vous pouvez certainement exécuter une seule application utilisateur après le démarrage du noyau. Mais il n'aura pas 100% du CPU car il y aura d'autres processus liés au noyau qui devront exister. Cela se fait généralement dans les périphériques Linux embarqués, par exemple les routeurs sans fil. J'ai également une expérience de première main dans ce domaine pour une application multithread.
Une fois le noyau démarré, un script d'initialisation ou de démarrage est exécuté. Renseignez-vous sur les niveaux d'exécution Linux et le processus d'initialisation. Il existe différents schémas de démarrage utilisés, il n'est donc pas possible d'être précis. Mais Linux vous permettra de configurer exactement les applications et les démons à exécuter pour votre situation. Outre un fichier de démarrage à la racine, les fichiers à modifier se trouvent dans / etc , et notamment /etc/init.d
BTW à moins que vous ne soyez un superprogrammeur ou avant de lancer un serveur GDB distant, vous aurez besoin d'une sorte de console de débogage (la console PC ou un port série) pour votre application. Cela vous permettra d'être averti des défauts de segmentation, des erreurs de bus et des échecs d'assertion. Prévoyez donc d'avoir une sorte de "périphérique" en plus du "réseautage".
la source
Il existe certaines applications système qui doivent être exécutées, à part elles, bien sûr, vous pouvez consacrer le reste des ressources informatiques à cette application. Pour avoir le minimum, vous pouvez jeter un œil à de très petites distributions Linux comme TinyCore Linux, etc.
Cela dépendrait également de l'application elle-même, des services dont elle a besoin en plus du réseau, etc.
Je pense que si vous pouvez fournir des informations plus spécifiques, vous obtiendrez une réponse plus détaillée.
Comme quel type d'application, etc.
la source
Si vous ne voulez vraiment que le noyau Linux, la mise en réseau et votre application, la seule façon de le faire est la suivante:
make menuconfig
) votre propre noyau personnalisé et supprimer toutes les fonctionnalités qui ne sont pas liées à l'exécution du système et à la mise en réseau. Vous voudrez désactiver pour bloquer la couche, je ne sais pas comment faire sur les noyaux récentsmake menuconfig
.init
échec, ou être prêt à vivre avec 1 processus d'espace utilisateur supplémentaire.Je sais qu'il est possible pour les modules du noyau de créer des processus - un simple en
ps aux
afficherait beaucoup sur un système typique (ils sont tous entre parenthèses). Vous voulez probablement que votre module crée un processus noyau. Pour vous débarrasser de tous les processus créés par le noyau en plus du vôtre, vous devrez désactiver les threads [kthreadd
], la gestion de l'alimentation [pm
], la couche d'événements [events
] et autres.Si vous voulez une configuration plus pratique du processus espace utilisateur noyau + 1, c'est possible.
Linux a une option de ligne de commande du noyau appelée
init=
- c'est ce que le noyau démarrera quand il aura fini de se charger. Le programme doit se trouver sur le périphérique racine spécifié avecroot=
ou dans l'initrd (chargé par votre chargeur de démarrage).Si ce programme se ferme, Linux paniquera, alors assurez-vous qu'il ne se ferme jamais.
De nombreuses distributions modernes de Linux l'ont configuré de sorte qu'un
init
programme dans l'initrd effectue une initialisation supplémentaire de l'espace utilisateur, avant de démarrer/sbin/init
ou/sbin/systemd
. Vous devrez découvrir ce que fait votre distribution ici (les informations pour Debian sont ici ) et trouver où vous pouvez spécifier le programme final de "transfert", et à partir de là, vous pouvez lui dire de démarrer votre application au lieu deinit
ousystemd
.systemd
gère de nombreuses fonctionnalités de base, telles que la construction/dev
, la définition du nom d'hôte,systemd
etc. Si je ne me trompe pas, il le fait essentiellement pour le mode mono-utilisateur ou de récupération - il démarre un shell.Vous aurez 2 processus en cours d'exécution (
systemd
et votre programme) mais le système ne paniquera pas si votre programme se ferme ou se bloque.Considérez également simplement une installation légère de Debian - une installation "netinst" n'a pas beaucoup de fonctionnement autre que le noyau, un shell et quelques services - ou considérez OpenWRT / LEDE - elle a un serveur web pour Luci fonctionnant par défaut et un coupler d'autres services mais est facilement désactivé.
la source