CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Question pertinante !

darklian
darklian
Niveau 10
12 avril 2004 à 07:16:41

Comment créer un boot sur une disquette ou sur un cd. Comment Faire pour crée la différence pour qu´il puisse être detecter au demmarage comme un element bootable. Comme exemple les anciennes disques boots.

lord_kalipsy
lord_kalipsy
Niveau 10
12 avril 2004 à 14:21:05

Je crois que tu aura plus de chance sur le forum hard ware. Mais p-ê quelqu´un répondra ici avant . ..

«psy

dnob700
dnob700
Niveau 10
12 avril 2004 à 20:05:30

que veux tu faire avec ?

faire sois même une disquette de boot, il ne pouront pas te répondre sur hardware, ici, peut-être que KeliOS pourra te répondre, parce qu´en fait, ca revient a créer son propre system d´exploitation.

Mais si tu veux juste faire une disquette MSDOS ou autre, il y a plein de logiciel sur le net pour ca.

Donc : dévellope ta question et on y répondra plus.

JeanYvesYves
JeanYvesYves
Niveau 10
12 avril 2004 à 22:32:29

Pour une disquette, c´est facile : ( sans utiliser l´otpion de windows pour faire une disquette de démarrage ( ce qui est encore + facile ! ! ) )

tu te mets sous DOS, tu te mets sous C:

et tu tapes :

sys a:

dnob700
dnob700
Niveau 10
12 avril 2004 à 22:58:35

Ah oui, et pour faire un CD, tu peut le faire avec nero.

Tu as l´option créer un CD Bootable, et il lui faut une source ( une disquette par exemple).

JeanYvesYves
JeanYvesYves
Niveau 10
12 avril 2004 à 22:59:45

tu ne peux pas prendre, comme pour une disquette, la source du boot de ton disque dur ?

Enfin je ne sais pas, j´ai jamais essayé avec un CD !
Mais je sais que pour une disquette, il lis le secteur d´amorce du HDD princiapal, et le copie sur la disquette au bon endroit.

Kelios
Kelios
Niveau 8
12 avril 2004 à 23:02:44

Bon.
Quand il te dis en fait " disquette non bootable, veuillez retirer la disquette" ou équivalent, en général, c´est qu´il a vraiment été booté.
J´explique, ça peut porter à confusion.

  • Notez ici que quand je parlerai de BIOS, je parle bel et bien de celle de la carte mère, et aussi, je ne parle que de l´architecture IA-32. Ça peut varier sensiblement d´une architecture à l´autre, surtout si on sort des x86*

C´est une norme des BIOS: au démarrage, ils ont plusieurs choses à faire, entre autres vérifier la RAM, le hardware, ect, et finalement loader un petit programme qui démarrera tout.

D´ou il ira le chercher? Disque dur, disquette, cd-rom, autre? Ça dépendra, la majorité des BIOS sont de toute façon configurables pour changer l´ordre de loadage.

Le principe est simple:
de ce qu´on appèle le boot disk ( le disque source, de démarrage, que ça soit une disquette, un disque dur, ect), il chargera en mémoire le premier secteur à l´adresse physique 0000 07C0, puis exécuté. Mais attention! Par norme, le secteur doit se terminer par une signature, AA55h. Cepandant, il arrive que certains BIOS n´y font pas attention.

Donc, techniquement, si le premier secteur finit par la signature, TOUTES les disquettes(et cd-roms) sont bootables.

Bon, il est cepandant évident que un secteur, soit 512 octets, moins les deux octets de la signature, 510 octets, ça fait pas un gros programme :)
Sur mon OS, ce bootsector ne fait donc que mettre en place une stack, afficher un message de bienvenue et charger des secteurs suivants la deuxième partie du bootloader qui, lui, chargera vraiment le Kernel.

En fait, le principe du " disquette non bootable, veuillez..." ect, c´est que le bootsector existe vraiment, et n´est programmé que pour écrire ce message, attendre une touche et redémarrer l´ordi.

Remarques spéciales:
Disquette -> On a tendance à oublier que c´est un disque, en fait. Donc il a tout à fait des secteurs des pistes et des têtes.

CD-Rom -> Je n´ai jamais programmé un cd-rom pour booté, et ne connais pas vraiment s´il y a des différences mineures. Mais je suis sur à 100% que le principe reste similaire. Y´a juste l´idée de multi-sessions qui me chiffonne un peu, mais je crois que ça n´affecte que les données.

Disque Dur -> Cas spécial, avec le MBR. Ouh ouh, dekosséquecéça le MBR? C´est le Master Boot Record, un tableau gérant les partitions. Là ça devient un peu bizzare, mais en gros, le principe est que le bootsector du disque dur ( secteur 0) ira loader un bootsector d´une partition préalablement choisie. En gros il joue comme un régulateur de bootsector, tout en étant un. Bizzare, mais ça se tient :).

Si vous voulez d´autres infos ou encore du code(parce que mon bootsector est fini ou presque, ´ne lui manque que une routine pour trouver le nombre de RAM dispo), n´hésitez pas.

Kelios
---------

DasHuhn
DasHuhn
Niveau 10
13 avril 2004 à 09:44:47

T´as fait ton propre OS ? Méga-respect... on peut le voir ?

dnob700
dnob700
Niveau 10
14 avril 2004 à 00:20:22

Pour les CD c´est la m^meme chose, je me souviens juste qu´il y avait un problème du au fait qu´en principe un boot secteur est inscriptible, ce qui n´est pas le cas sur un CD, il faut alors émuler je ne sais quoi.

Mais bon, le principe est le même.

Kelios
Kelios
Niveau 8
14 avril 2004 à 01:21:14

Je n´ai pas malheureusement fini mon OS, il n´en ai qu´à ses balbutiements. En gros je commence avec le kernel, pas grand chose de déjà fait.
C´est qu´en fait mon Boot loader est déjà fait, et, comme tous les bootloaders, le code est mooooche.
En fait on peux pas y changer grand chose, du à la nature hybride de l´architecture x86, entre le 16 et le 32 bits.
Même en commentant... en tout cas, si tu veux voir des trucs, y´a à peu près rien à voir. Y´a aucun GUI pour l´instant de toute façon, même pas de vrai kernel, donc t´irais pas loin :)
À quoi je veux que ça ressemble? Pour maximiser les chances de réussite, je coupe dans le superflu. La plus notable différence serait dans le GUI. Ça ressemblerais à l´idée du DOS SHELL, si tu as connu ça.
De toute façon je suis pas pressé. Je le fait à ma guise, si je veux pas programmer, je me force pas. Ça n´avance alors pas toujours très vite, et ce n,esty pas grave. De toute façon je ne m´y sens pas forcé, la programmation tend à devenir bien plus un passe temps qu´un futur métier avec le temps, donc je prend plaisir aux subtilités de l´IA-32 lentement.

Si un jour j´en viens à faire un truc potable, ne t´inquiètes point, je l´indiquerai sur le forum avec sous possible license GPL. On sait jamais.

Kelios
---------

lord_kalipsy
lord_kalipsy
Niveau 10
14 avril 2004 à 03:49:21

Le jour ou tu auras quelque chose, n´oubli pas de me montrer la source :) je me suis toujours demander à quoi ça ressemble la source d´un OS. ^^

«psy

Scullder
Scullder
Niveau 10
14 avril 2004 à 15:37:56

^^ => http://www.kernel.org

DasHuhn
DasHuhn
Niveau 10
14 avril 2004 à 16:13:01

Kelios> J´ai pas besoin d´une GUI. Mais si même le kernel est pas prêt c´est vrai que j´irai pas loin.
Comme tu le dis, si un jour tu fais qqchose de potable, je serais ravi de t´aider ( enfin laisse moi un peu le temps d´apprendre).

kljdrf
kljdrf
Niveau 6
16 avril 2004 à 12:46:18

Kelios, ton début de programme m´intéresse. En fait, j´aimerais savoir à quoi doit ressembler le programme bootable pour pouvoir charger un autre programme de 64ko.

Kelios
Kelios
Niveau 8
16 avril 2004 à 23:06:13

On va faire simple alors:
en utilisant nasm et partcopy, c´est très petit.

D´abord, 64 K c´est 10000h octets. Donc, en divisant par un Ko ( 400h) on obtient: 40h secteurs. Soit 64 secteurs, quoi. Hors, il se trouve que un cylindre ( cylinder) sur une disquette a 64 secteurs ( sector). Ça veux dire quoi? Ça veux dire une chose: on a pas assez d´un cylindre pour ton prog! En effet, il y a aussi le bootsector lui-même à prendre en compte!
On a donc deux choix:
Soit on place le début de notre programme dès le deuxième secteur, et le 64e ira sur le deuxième cylindre.
La deuxième, celle que je préfère pour l´estétique, est de placer seul le bootsector sur le premier cylindre, et l´intégralité de ton programme sur le deuxième cylindre ( qui rentrera parfaitement). Oui, ça fait 63 secteurs non-utilisés dans le premier cylindre, mais ça pourrait servir à je ne sais pas trop quoi ( un config " file", une deuxième partie du bootloader, ect...)

Pour faire notre programme, je vais me baser sur mes outils préférés:
nasm et partcopy. Pourquoi ces deux là? Ils sont gratuits, et étonnament, aucun autre outil pour le dev amateur ne leur arrive à la cheville ( à mon avis. Y´a fasm aussi, mais je ne le trouve pas assez orienté vers ce type de programmation).
Partocpy, pour ceux qui ne connaissent pas, est un programme extrêment puissant pour copier des fichiers et données sur un disque ou un fichier, de façon physique. par exemple, placer sur une disquette des données à un secteur précis. Il ne respecte pas aucun formatage, et est très dangereux ( dans le sens ou vous pouvez même écrire sur votre disque dur), mais aussi très puissant.

Commençons par notre bootloader:
Pour lire le programme, nous nous servirons de notre copain le BIOS. Ça nous évite de passer par les lourds ports I/O, et allège le code.
Notez ici que je le load et le part en mode réel - le code ne tienderait probablement pas avec un passage en mode protégé + gdt + idt ect...
L´interrupt à utiliser est le int 13h - 02. Vous trouverez un peu partout sur le net des infos dessus, je ne crois pas nécessaire le besoin de spécifier son fonctionnement...

Allons y!
[BITS 16]
[ORG 0]

start:

; On va arranger DS ( voir plus bas - note à ce sujet)
mov ax, 07C0h
mov ds, ax

; Plaçage de la stack! J´ai choisi ici un endroit sécuritaire:
; de 90000h à 9FFFFh. Vous pouvez bien sur la placer ou vous voulez,
; mais vérifiez tout de même, y´a des endroits ou il ne faudrait pas.
; Voir une map de la mémoire en mode réel
cli
mov eax,9000h
mov ss,eax
mov eax,0xFFFF
mov esp,eax
sti

; Chargement de ton programme:
; Il y a ici des étapes à respecter,
; selon la norme.
; D´abord, il faut toujours réinitialiser
; le controleur de disque avant de lire.
; Ça évite les erreurs répétées.
; Deuxièmement, des erreurs de lecture
; peuvent être dues au moteur n´arrivant pas
; à tourner assez rapidement.
; dans ces conditions, il est important de réessayer.
; Trois essais est bien correct,
; mais le problème vient de manque de registres.
; On va donc utiliser des registres 32 bits,
; au risque de casser la compatibilité.
; Le principe est simple: le highest byte de ecx vont servir de compteur. ( inversés grâce à bswap)

; Aussi, note importance: par norme,
; dl contiendera le numéro de boot disk originel.
; Qu,est-ce que c´est, ce truc? C´est un numéro représentant,
; pour le BIOS, un périphérique.
; Le premier lecteur de disquette est par exemple
; 0h. Le premier disque dur est 80h, ect...
; malheureusment, on ne peux savoir si on vient
; du premier lecteur ou d´un possible deuxième.
; À moins de connaitre l´hardware de la machine cible,
; Bien sur... Alors dl va venir à notre rescousse.

; Prépare le compteur
mov ecx, 03000000h

. charge:

; int 13 - 00 réinitialise le disque dl.
xor ax, ax
int 013h

; int 13 - 02 lecture de secteurs.
mov ax, < Segment de destination de votre choix>
mov es, ax
mov ah, 02
mov al, 64
mov bx, < Offset de destination de votre choix>
mov ch, 1
mov cl, 1
mov dh, 0
int 013h
jnc . saut

bswap ecx
or cl, cl
jz erreur
sub cl, 1
bswap ecx
jmp . charge

. saut:
jmp < Seg de dest>:<Off de dest>

erreur:
cli
hlt

Note sur la position du bootloader:
J´utilise ici une origine de 0, et un ds de 07C0h pour compenser.
Il se trouve que la majorité des BIOS placent le bootloader à 07C0h:0000h, mais certains le placent à 0000h:7C00h. Vous me direz mais, on s´en fous, ça fait aucune différence, c´est la même adresse!
OUI, c,est la même adresse, mais NON, on s,en fous pas! parce que alors, certains BIOS s´ajustent à leurs trucs, et placent leurs segment register de cette façon!
Problème! Si on les modifie, alors les interrupts du BIOS ne marchent plus! M´enfin, peut-être, si ils remmetent des valeurs de segment pendant leur exécution, mais ce n´est jamais sur, et donc, on ne peut pas se permettre de faire ça!
Donc là, on est dans le cul de sac. On fait quoi?
Moi je dis, foutez 07C0h:0000h par défaut, et si ça marche pas, changez le code :D

Vous commencez à voir la difficulté? Ils y a toujorus des BIOS qui exceptionnent à la règle, ou encore du hardware qui exceptionne à la régle. Et encore que dire de bogues de BIOS? Oui ça existe, et il faut jongler avec ça pour faire un bootloader prolofique. Je n´en tiens pas vraiment compte, ne visant pas haut, mais aller voir le code source de GRUB, ça doit être assez impressionant.

Ici, en passant, le programme plat 64K doit être plat, j´entend par là que le premier octet doit être le début du prog. Sinon, vous pouvez modifier ou vous jmp-ez.

J´ai écrit trop de truc, j´ai pas osé révisé. Si J´ai fait une erreur, ben c´est trop tard :)
Oh, et j´ai pas du tout testé le code. J´ai écrit ça sur le vite, j´ai pu faire des erreurs.

À assembler avec nasm et placer sur une disquette avec partcopy:
http://nasm.sourceforge.net
http://my.execpc.com/~geezer/johnfine/#zero

Kelios
----------

Kelios
Kelios
Niveau 8
16 avril 2004 à 23:08:22

Oups, j´ai oublié la signature:

les dernières lignes du prog doit être:

times 510-($-$$) db 0
dw 0xAA55

Voilà!

Kelios
---------

kljdrf
kljdrf
Niveau 6
17 avril 2004 à 12:02:47

:ok: Ca au moins c´est une réponse complète, claire et simple à comprendre ! !!
Merci Kelios pour tous ces détails.

Evanescence
Evanescence
Niveau 5
17 avril 2004 à 19:05:27

Juste un petit truc, l´utilisation des registres étendus en mode réel c´est... c´est conceptuel quoi. Surtout quand on peut s´en passer.
Tu initialises une pile, c´est pas pour faire beau, c´est pour l´utiliser. Donc à la place du petit délire avec bswap, ça peut-être + intéressant ( moins dangereux) d´utiliser un ptit push/pop autour de l´int 13h-2.

Et puis concernant le 0x07c0:0 ou 0x0:7c00 c´est la même chose. ; )

un ptit lien intéressant : http://inferno.cs.univ-paris8.fr/~am/tutorial/os/tutorial00.html

Kelios
Kelios
Niveau 8
18 avril 2004 à 05:57:45

" Tu initialises une pile, c´est pas pour faire beau, c´est pour l´utiliser."
Par le programme. Perso, je préfère le " petit délire avec bswap". :)

" Et puis concernant le 0x07c0:0 ou 0x0:7c00 c´est la même chose. ; ) "
Tu n´as pas compris. Les BIOS pensant en 0x07c0:0 se basent sur le principe que c´est le segment qui, si on veux forme l´adresse de base, et l´offset n´est alors qu´un index.
À l´inverse, ceux utilisant 0x0:7c00 voient le problème à l´inverse.
Ça veux dire que ceux se basant sur le principe de 0x07c0:0 s´attendent à ce que les segment register, en particulier cs, soient à 0x07c0, et que lorsque l´on accède à une variable, ou encore que l´on saute en near, que ça soit un index partant de 7C00, partant du début du bootloader en mémoire.
À l´opposé, ceux qui voient ça en 0x0:7c00 s´attendent à ce que les appels en near et les accès mémoire soit absolus, partant de 0.
Tout ça vient du principe même du code généré. D´ou le [ORG 0]...
Je n´ai toujours pas été assez clair?
´Faut par me prendre pour un débile non plus. je sais très bien que 0x07c0:0 et 0x0:7c00 c´est la même adresse. Mais de la à dire que c´est la même chose, non, je suis pas d´accord. C´est souvent la même chose, mais le *principe* ( et j´insite fortement sur ce terme) est différent.
Au sens purement arithmétique, cela revient au même:
07C0*10+0=7C00.
Mais au sens de principe, d´interprétation, c´est opposé:
Avec 0x07c0:0, le segment forme la base, et on indexe avec l´offset.
Avec 0x0:7c00, l´offset offre soit une adresse absolue, flat, ou peut être combiné avec le segment. Ici il n´y a pas d´indexage.
Tu vas me dire que ce n´est pas les vrais termes. Que ce n´est pas le principe formel tel qu´on l´apprend. Je m´en fous. C´est une autre façon de voir les choses, qui surligne les différences de principe entre les deux adressages.

À moins que tu ne comprenne toujours pas mon point de vue, je considère donc le débat clos sur ce point.

Sinon, oui, on peux utiliser la stack pour oublier cette idée des registres 32 bits en 16 bits. Perso moi je vise une machine cible de 386+. Pourquoi? Parce que mon OS marche en mode protégé 32 bits, tout simplement. Donc je peux TOUJOURS me baser sur des registres 32 bits. Et j´ai pour habitude de privilégier les registres à la mémoire, par habitude surtout.

J´irai répondre à ton autre post sur ma philosophie de programmation une autre journée. Il est minuit ici, je vais me coucher pour me permettre de revoir un peu le bourdier que j´ai codé aujourd´hui avec mon allocateur dynamique.
Y´a un truc qui cloche, je sais c´est quoi, et je vais devoir recoder une partie :nonnon:

Kelios
---------

Evanescence
Evanescence
Niveau 5
18 avril 2004 à 12:28:18

J´ai compris ton point de vue, mais je maintiens que c´est la même chose.
Tu peux aussi bien faire :

[org 0]
. ..
mov ax,0x07c0
mov ds,ax
. ..

que

[org 0x7c00]
. ..
xor ax,ax
mov ds,ax
. ..

Maintenant en france on a l´habitude de choisir la première solution. Mais les deux sont valables, puisque fondamentalement équivalentes.
Quelle différence entre : " les chiottes sont au bout du couloir" et " tu vas au bout du couloir, tu trouveras les chiottes"

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment