2010-06-19 3 views
2

Je suis intéressé par l'écriture d'un logiciel qui fonctionne avec le moins de démarrage possible. Que fais-je? Est-ce une question d'assemblage? Dois-je faire quelque chose de spécial avec le disque sur lequel le logiciel doit fonctionner?Comment puis-je écrire un logiciel qui fonctionne très proche du démarrage du système?

Pour clarifier, je cherche un point où stdin et stdout sont disponibles, mais pas grand chose d'autre.

+0

Sommes-nous parle code de niveau sous-os ici? – ChaosPandion

+0

Oui.Je veux graver un programme simple sur le disque et que le système exécute seulement ce programme. – lowerkey

Répondre

3

Si vous souhaitez exécuter du code après le test POST mais avant le démarrage du système d'exploitation, vous devez soit brancher le chargeur de démarrage, soit le remplacer. Il n'y a pas de réponses simples aux prochaines questions que vous allez poser.

Il y a assez peu de ressources sur Internet pour écrire votre propre bootloader - vous pouvez commencer avec eux:

Si vous vous trouvez à la recherche de un bon livre sur l'assemblage x86, essayez:

+0

Au risque de ne pas avoir de réponses faciles: cela signifie-t-il que j'écrirais mon propre chargeur de démarrage? – lowerkey

+0

J'ai regardé ce que POST signifie, oui, je pensais juste ce que vous avez dit. Serait-il possible de faire une nouvelle entrée dans le bootloader et de le faire pointer vers mon programme? – lowerkey

+0

Ou plutôt remplacer le bootloader avec votre programme. Si vous n'avez pas besoin de plus de 510 octets. :) –

0

Cela dépend du système d'exploitation. Vous devez ajouter votre programme à la clé de registre RunOnce sous windows, et au script init sous linux (il existe différentes méthodes init sous linux, donc il existe différentes méthodes).

+1

Je suis intéressé par l'écriture de logiciels qui s'exécutent avant le chargement de Windows ou Linux. Y-a-t-il un moyen de faire ça? – lowerkey

1

Une façon de achive cet effet pourrait être de réutiliser certains OS très limitées comme une dénudation Linux ou peut-être même vieux DOS, puis les avoir exécuter votre code automatiquement au démarrage. Mais cela dépend exactement de la raison pour laquelle vous voulez faire cela si cette solution vous convient.

Modifier: Ou si cela ne suffit pas, je vous suggère de regarder le Lilo ou grub4dos ou quelque chose de similaire pour voir si vous pouvez insérer votre code là-bas d'une manière ou d'une autre. Les forums sur le site Boot Land pourraient être utiles aussi car ils semblent tout à fait dans la façon de personnaliser le processus de démarrage.

+1

DOS est encore très vivant dans le monde embarqué, pompes à essence, caisses enregistreuses, etc. DOS isnt mal. Vous devriez regarder Linux à partir de zéro pour comprendre le processus de démarrage de Linux et vous constaterez que vous pouvez raccourcir considérablement et démarrer directement dans un programme intégré. –

1

Exécutez simplement Linux sans tous les déchets que les distributions fournissent? Mon noyau prend 1,8 secondes à charger. C'est la façon la plus simple de le faire. Voir Linux From Scratch.

stdin et stdout sont OS concepts spécifiques, ils n'existent pas pré-démarrage, (bien que peut-être dans certains BIOS personnalisés ou bootloader ils ...)

Le prochain endroit le plus bas serait le chargeur de démarrage, certaines choses sont initialisées à ce moment-là, mais vous aurez encore beaucoup de travail à faire.

Vous pouvez aller encore plus bas, charger votre propre BIOS, mais vous devez ensuite prendre soin de toutes les choses non standardisées que votre BIOS prend en charge.

+0

Juste après le bootloader serait parfait. Je veux juste pouvoir faire la production d'entrée de base. – lowerkey

0

Voici un chargeur de démarrage simple pour vous aider à démarrer. Vous aurez besoin de nasm, dd et d'une disquette.

http://www.cs.umbc.edu/courses/undergraduate/313/spring05/burt_katz/lectures/Lect11/newBootSector.html

; boot1.asm stand alone program for floppy boot sector 
; Compiled using   nasm -f bin boot1.asm 
; Written to floppy with dd if=boot1 of=/dev/fd0 

; Boot record is loaded at 0000:7C00, 
     ORG  7C00h 

; load message address into SI register: 
     LEA  SI,[msg] 

; screen function: 
     MOV  AH,0Eh 

print: MOV  AL,[SI]   
     CMP  AL,0   
     JZ  done    ; zero byte at end of string 
     INT  10h    ; write character to screen.  
     INC  SI   
     JMP  print 

; wait for 'any key': 
done: MOV  AH,0  
     INT  16h    ; waits for key press 
            ; AL is ASCII code or zero 
            ; AH is keyboard code 

; store magic value at 0040h:0072h to reboot: 
;  0000h - cold boot. 
;  1234h - warm boot. 
     MOV  AX,0040h 
     MOV  DS,AX 
     MOV  word[0072h],0000h ; cold boot. 
     JMP  0FFFFh:0000h  ; reboot! 

msg  DB  'Welcome, I have control of the computer.',13,10 
     DB  'Press any key to reboot.',13,10 
     DB  '(after removing the floppy)',13,10,0 
; end boot1 
Questions connexes