Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > Programmation d'OS
Programmation d'OS Programmation de systèmes d'exploitation
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/11/2008, 16h21   #1
Keweed
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 82
Points : 38
Points : 38
Par défaut Bootloader sur clé USB

Bonjour,

J'essaye actuellement de dévelloper un programme en assembleur qui affiche un message "chargement du kernel" puis fais un jump en mémoire vers l'adresse ou est chargé le kernel qui affiche "kernel is speaking". Mon problème est que j'utilise une cle usb pour booter et apparement le kernel n'est pas charger en mémoire. J'ai lu que l'interruption 0x13 ne gére que les disque dur et disquette. Je n'ai pas trouvé d'information précise sur le sujet. Si quelqu'un pouvait m'indiquer si l' interruption 0x13 gére les clé usb et si elle ne les gère pas quel interruption le fait (mon bios gère le boot par clé usb). Voici le code de mon secteur de boot :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
 
%define BASE   0x100  
%define KSIZE  1  ; nombre de secteurs de 512 octets a charger
 
[BITS 16]
[ORG 0x0]
 
    mov [bootdrv], dl  ; recuparation de l'unite de boot
 
; initialisation des segments en 0x07C0
    mov ax, 0x07C0
    mov ds, ax
    mov es, ax
    mov ax, 0x8000  ; stack en 0xFFFF
    mov ss, ax
    mov sp, 0xf000
 
; affiche un msg
    mov si, msgDebut
    call afficher
 
; charger le noyau
    xor ax, ax
    int 0x13
 
    push es
    mov ax, BASE
    mov es, ax
    mov bx, 0
 
    mov ah, 2
    mov al, KSIZE
    mov ch, 0
    mov cl, 2
    mov dh, 0
    mov dl, [bootdrv]
    int 0x13
    pop es
 
 
 
; saut vers le kernel
    jmp dword BASE:0
 
 
msgDebut: db "Chargement du kernel", 13, 10, 0
 
bootdrv: db 0
 
; fonction
 
afficher:
    push ax
    push bx
.debut:
    lodsb         ; ds:si -> al
    cmp al, 0     ; fin chaine ?
    jz .fin
    mov ah, 0x0E  ; appel au service 0x0e, int 0x10 du bios
    mov bx, 0x07  ; bx -> attribut, al -> caractere ascii
    int 0x10
    jmp .debut
 
.fin:
    pop bx
    pop ax
    ret
 
;; NOP jusqu'a 510
times 510-($-$$) db 144
dw 0xAA55
Pour info les commandes que j'utilise pour charger les programmes sur la cle usb :

dd if=/home/user/boosect of=/dev/sdb count=1 (pour le secteur boot)
dd if=/home/user/kernel of=/dev/sdb count=1 seek=1 (pour le kernel)

Merci
Keweed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2008, 06h20   #2
Forthman
Membre expérimenté
 
Avatar de Forthman
 
Homme François
conception mécanique
Inscription : janvier 2005
Messages : 330
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 37
Localisation : France, Tarn et Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : conception mécanique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 330
Points : 532
Points : 532
Hello,

La majorité des BIOS modernes identifient une clef USB comme étant un
disque-dur.

J'ai moi-même une clef USB de 2Go bootable sous DOS qui me sert aussi à
stocker différents fichiers sous différents OS (XP,Linux et DOS)

Pour la rendre bootable, la solution que j'ai utilisé a été la suivante
- formater la clef USB en FAT16 (par défaut si elle fait pas plus de 2Go)
- trouver un PC qui a encore un lecteur de disquette
- insérer la clef USB
- démarrer une disquette bootable DOS
- la clef USB est reconnue comme un disque-dur (dans mon cas c'était D
- faire un "FORMAT D:/U/S" (ou tout autre nom de lecteur attribué à la clef)
- ajouter tous les fichier utiles pour le DOS (en particulier la gestion clavier)

voila,pour moi c'est la solution la plus simple car Win$ gère la clef USB...
comme une clef USB et du coup, impossible de la rendre bootable

Maintenant il existe surement des logiciels (RAWRITE ?) qui permettent de faire ça sans passer par bootage sur un lecteur de disquette

a+ François
Forthman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2008, 13h54   #3
Keweed
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 82
Points : 38
Points : 38
Par défaut Re : Bootloader sur cle usb

Bonjour,

Merci pour la réponse mais je ne souhaite pas booter sur ma cle USB par l'intermédiaire d'une disquette. Je réexplique mon problème plus clairement. Mon bios charge bien en mémoire (0x07C0) le premier secteur de la clé usb. Ceci est géré par le BIOS mais le problème survient survient lorsque j'essaye de charger le deuxieme secteur de ma clé USB (le kernel) en mémoire avec l'interruption du 0x13 du BIOS. Apparement le kernel n'est pas chargé en mémoire. Ce que je voudrais savoir c'est si le problème vient de mon code ou si cela vient du fait que l'interruption 0x13 ne gére pas les clé usb. Et si int 0x13 ne gère pas les clé usb quel interruption le fait.
Merci
Keweed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2008, 20h51   #4
calving
Invité de passage
 
Inscription : avril 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 10
Points : 3
Points : 3
Salut,

C'est un peu une réponse en coup de vent, je n'ai pas vraiment regardé ton code, sauf qu'il y avait bien le mot magique 0xaa55 à la fin, mais comment est ce que ton ordi régait quand tu le démarre ? Il démarre un autre OS ou bien ne fait rien ? Tu es sûr que ce n'est pas ton code qui a un problème, t'as essayé dans un émulateur ? Vérifie aussi dans ton BIOS que ton disque dur ne soit pas avant ta clé dans les priorités de démarrage. Parce que normalement, comme l'a dit Forthman, les clés usb sont gérées comme des disques durs par le BIOS (sauf si tu travailles sur un ancêtre ;-) ).
calving est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2008, 14h20   #5
Keweed
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 82
Points : 38
Points : 38
Salut,

Lorsque je boot sur ma cle le message "Chargement du kernel" s'affiche mais après rien le message "kernel is speaking" ne s'affiche pas (message qui ne se trouve pas dans le MBR mais dans le kernel que j'essaye de charger dans le MBR avec l'interruption 0x13). Donc le boot se passe bien mais apparement mon deuxième secteur de la clé qui contient le kernel n'est pas chargé en mémoire. Le problème vient soit de mon code de l'interruption soit de mon jump. Je rajoute le code du kernel (chargé au deuxieme secteur de ma clé) au cas ou le probleme viendrait de la :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[BITS 16] ; mode reel 16 bits
[ORG 0x0] 
 
mov ax, 0X0100
mov ds, ax
mov es, ax
mov ax, 0x8000
mov ss, ax
mov sp, 0xF000
mov si, msg00
call afficher
 
end:
	jmp end;
 
afficher:
	push ax
	push bx
	.debut
		lodsb
		cmp al, 0
		jz .fin
		mov ah, 0x0E
		mov bx, 0x07
		int 0x10
		jmp .debut
 
	.fin
	pop bx
	pop ax
	ret
 
msg00 db "Kernel is spiking", 10, 0
Keweed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2008, 16h01   #6
Forthman
Membre expérimenté
 
Avatar de Forthman
 
Homme François
conception mécanique
Inscription : janvier 2005
Messages : 330
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 37
Localisation : France, Tarn et Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : conception mécanique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 330
Points : 532
Points : 532
Essayes de faire une boucle de lecture du secteur tant que la lecture échoue
(parfois le reset du disque provoque une erreur a la lecture suivante)

Tu peux aussi essayer de modifier l'emplacement de ton segment (genre 1000h au lieu de 100h)

a+ François
Forthman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2008, 21h13   #7
Keweed
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 82
Points : 38
Points : 38
Salut,

J'ai donc vérifié le code d'erreur de l'interruption 0x13. Après l'interruption la valeur 02H (address mark not found) est contenu dans le registre AH. Malheureusement je ne comprend pas l'erreur. Si j'ai bien compris l'erreur indique que l'adresse du secteur 2 du cylindre 0 n'a pas été trouvé. J'ai essayé en mettant le secteur 2 du cylindre 1 mais même résultat. Je passe bien le numéro du disque (de la cle dans mon cas) dans le registre DH j'ai aussi essayé de modifier DL (le head number) en le mettant à 1. Toujours la même erreur j'ai beau relire mon code je ne vois pas d'où vient l'erreur.
Keweed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2008, 21h48   #8
Keweed
Nouveau Membre du Club
 
Inscription : juin 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 82
Points : 38
Points : 38
Re-bonjour,

J'ai enfin trouvé mon erreur, une erreur de débutant en fait. J'ai récupérer la valeur du registre DL et l'ai mis dans la variable bootdrv avant d'avoir déclaré la pile.
Keweed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2008, 23h16   #9
Forthman
Membre expérimenté
 
Avatar de Forthman
 
Homme François
conception mécanique
Inscription : janvier 2005
Messages : 330
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 37
Localisation : France, Tarn et Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : conception mécanique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 330
Points : 532
Points : 532
Hello,

ce n'est pas la pile que tu doit déclarer, mais juste le segment de donnees.
ou alors tu utilises cs:[bootdrv]

a+ François
Forthman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2008, 09h06   #10
milouz123
Membre actif
 
Inscription : mai 2008
Messages : 157
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2008
Messages : 157
Points : 160
Points : 160
J'en suis également quitte pour une mise à jour du 2e chapitre du tutoriel sur Pépin. Par négligence, je n'avais jamais pensé à tester le boot à partir d'une autre unité que floppyA.
Je confirme le problème, et son correctif, si on essaye de booter à partir d'un disque dur.

Merci pour cette remonté de bug
milouz123 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2010, 16h30   #11
Bachel
Invité de passage
 
Inscription : janvier 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 4
Points : 4
Points : 4
Bonjour,

Le topic est inactif depuis un petit moment mais je tente ma chance en y demandant de l'aide.

Pour faire court, on me demande dans le cadre d'un projet de rendre une clé USB bootable en programmant un secteur de boot.

Je me suis donc servi du mode opératoire très intéressant de Milouz123:
http://a.michelizza.free.fr/pmwiki.p...utoOS.Bootsect

Pour commencer, j'ai choisi le tuto qui créé un secteur de boot qui affiche un message.
Voici le code du secteur de boot:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[BITS 16]  ; indique a nasm que l'on travaille en 16 bits
[ORG 0x0]
 
; initialisation des segments en 0x07C00
    mov ax, 0x07C0
    mov ds, ax
    mov es, ax
    mov ax, 0x8000
    mov ss, ax
    mov sp, 0xf000    ; stack de 0x8F000 -> 0x80000
 
; affiche un msg
    mov si, msgDebut
    call afficher
 
 
end:
    jmp end
 
 
;--- Variables ---
    msgDebut db "Hello world !", 13, 10, 0
;-----------------
 
;---------------------------------------------------------
; Synopsis: Affiche une chaine de caracteres se terminant par 0x0
; Entree:   DS:SI -> pointe sur la chaine a afficher
;---------------------------------------------------------
afficher:
    push ax
    push bx
.debut:
    lodsb         ; ds:si -> al
    cmp al, 0     ; fin chaine ?
    jz .fin
    mov ah, 0x0E  ; appel au service 0x0e, int 0x10 du bios
    mov bx, 0x07  ; bx -> attribut, al -> caractere ascii
    int 0x10
    jmp .debut
 
.fin:
    pop bx
    pop ax
    ret
 
;--- NOP jusqu'a 510 ---
    times 510-($-$$) db 144
    dw 0xAA55
J'ai compilé le fichier sectboot.asm avec la commande:
nasm -f bin -o bootsect bootsect.asm

J'ai formaté ma clé USB en FAT sous Linux.
Puis j'ai copié le fichier sectboot sur le 1er secteur de la clé avec la commande:
dd if=bootsect of=/dev/sdb bs=512 count=1
J'ai le message qui montre que la copie s'est bien effectuée

Mais au final, ma clé ne boot pas et j'ai le message suivant:
"this is not a bootable disk please insert a bootable floppy and press any key to try again"

Quand je teste le code avec l'emulateur qemu, cela fonctionne donc je pense que le problème provient de la préparation de ma clé...

- Mauvais formatage?
- Suppression de données importantes sur la clé USB lors de la commande dd? (pourtant copie seulement le 1er secteur de 512 octets avec les options bs=512 et count=1)
- Modifs à effectuer sur le code vu qu'il est prévu pour une disquette et qu'avec mon test sur qemu qui est ok, je créé également une image de disquette?

Pour info, j'ai essayé avec plusieurs clés USB (128 Mo, 2 Go et 4 Go...)


Je suis novice en langage C et je ne connais pas le langage Assembleur donc c'est surement un truc tout con que j'ai zappé

Merci d'avance pour votre aide
Bachel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2010, 16h57   #12
bifur
Membre habitué
 
passe le balais et l'aspirateur
Inscription : mars 2008
Messages : 111
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : passe le balais et l'aspirateur

Informations forums :
Inscription : mars 2008
Messages : 111
Points : 126
Points : 126
je dit peut etre une connerie mais ça vient surement de la séquence de boot de qemu, le mesage d'erreur semble vouloir dire que qemu boot sur la disquette et pas sur la clef usb
bifur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2010, 17h26   #13
Bachel
Invité de passage
 
Inscription : janvier 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 4
Points : 4
Points : 4
Merci pour ta réponse mais j'ai le message quand je boote sur mon ordi.
Sur Qemu, ca marche bien avec une image d'une disquette...

D'après moi, plusieurs causes sont possibles:
- clé USB mal formatée
- commande "dd" qui copie le sectboot mal paramétrée et suppression de données nécessaires au boot sur ma clé USB
- code du sectboot à modifier pour l'adapter à un boot sur clé usb car initialement prévu pour être copié sur une disquette

En complément d'infos, mon ordi peut booter sur une clé.
J'ai l'option dans le bios et j'ai déjà booté sur des clés USB (clé BartPE et clé USB bootable avec Linux)

Merci d'avance
Bachel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2010, 19h24   #14
bifur
Membre habitué
 
passe le balais et l'aspirateur
Inscription : mars 2008
Messages : 111
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : passe le balais et l'aspirateur

Informations forums :
Inscription : mars 2008
Messages : 111
Points : 126
Points : 126
copier ton programme sur le premier secteur devrait détruire le formattage (vu que c'est dans le premier secteur que sont enregistré les information de la partition)est ce le cas?

sinon l'option count correspond au numéros du secteur que l'on copie ou au nombre de secteur a copier? si ça correspond au numéros du secteur a remplacer, essaye plutot zéro comme valeur
bifur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2010, 20h06   #15
Bachel
Invité de passage
 
Inscription : janvier 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 4
Points : 4
Points : 4
Citation:
Envoyé par bifur Voir le message
copier ton programme sur le premier secteur devrait détruire le formattage (vu que c'est dans le premier secteur que sont enregistré les information de la partition)est ce le cas?
Je ne suis pas sur à 100 %, mais pour moi ça ne détruit pas le formatage physique de la clé.. ça détruit seulement la table de partitions contenue dans le secteur de boot.

Citation:
sinon l'option count correspond au numéros du secteur que l'on copie ou au nombre de secteur a copier? si ça correspond au numéros du secteur a remplacer, essaye plutot zéro comme valeur
Count signifie sur quel secteur de la clé, on copie le fichier.
Le secteur de boot étant sur le 1er octet, il faut donc donner la valeur 1.

J'ai tout de même testé avec count=0, mais ca ne copie rien

# dd if=bootsect of=/dev/sdb bs=512 count=0
0+0 enregistrements lus
0+0 enregistrements écrits
0 octet (0 B) copié, 0,000130758 s, 0,0 kB/s


Avec count=1; la copie s'effectue bien:
dd if=bootsect of=/dev/sdb bs=512 count=1
1+0 enregistrements lus
1+0 enregistrements écrits
512 octets (512 B) copiés, 0,000304295 s, 1,7 MB/s
Bachel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2010, 20h30   #16
bifur
Membre habitué
 
passe le balais et l'aspirateur
Inscription : mars 2008
Messages : 111
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : passe le balais et l'aspirateur

Informations forums :
Inscription : mars 2008
Messages : 111
Points : 126
Points : 126
effectivement remplacer le premier secteur d'un disque ça ne détruit pas le formattage physique mais le formattage logique (les partitions)

le paramètre count est visiblement le nombre de secteur a copier (donc zéro ça copie rien ^^)

en tout cas ce dont je suis sur c'est que remplacer le premier secteur de ta clef par ton petit programme t'empèche de pouvoir lire la/les partition de ta clef, si après avoir effectué l'opération tu peut encore acceder a la partition de la clef c'est que le programme a été mal copié
bifur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2010, 21h49   #17
Bachel
Invité de passage
 
Inscription : janvier 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 4
Points : 4
Points : 4
En effet, je pouvais toujours accéder à ma clé donc ma copie du secteur de boot ne devait pas être correcte car la table des partitions était toujours présente…

Mais j'ai enfin réussi à booter sur ma clé USB, ca fait plaisir !
Par contre, ça me ferait encore plus plaisir si je comprenais pourquoi.

En fait, j'ai juste rajouté l'option -I dans la commande mkfs.vfat:
mkfs.vfat -F -32 -I –n USBboot /dev/sdb1

Dans le man, il est indiqué :
Citation:
- I: Normally you are not allowed to use any 'full' fixed disk devices. mkdosfs will complain and tell you that it refuses to work. This is different when usind MO disks. One doesn't always need partitions on MO disks. The filesytem can go directly to the whole disk. Under other OSes this is known as the 'superfloppy' format.

This switch will force mkdosfs to work properly.
J'avoue ne pas trop comprendre ce que ça fait mais c'est clair que mon problème venait d'un mauvais formatage de ma clé…
Bachel est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h30.


 
 
 
 
Partenaires

Hébergement Web