Charger un noyau

cs_Stormy Messages postés 255 Date d'inscription samedi 20 avril 2002 Statut Membre Dernière intervention 16 janvier 2007 - 26 août 2004 à 00:04
cs_meganet Messages postés 1 Date d'inscription jeudi 9 novembre 2000 Statut Membre Dernière intervention 11 juin 2005 - 11 juin 2005 à 23:48
Je voudrais charger le deuxième segment d'une disquette pour lancer un noyau OS rudimentaire. Sur le premier segment, j'inscris donc le code de chargement. Or, mes entrées sont-elles justes? Merci ++

xor Dx, Dx ; XORisation de Dx (Lecteur Disk principal).
mov Ah, 02h ; Lecture pour mise en mémoire.
mov Al, 01h ; Lecture d'un seul secteur.
mov Bx, 7E00h ; Offset [Bx] de la zone mémoire.
mov Cx, Dx ; Lecture de la piste première.
mov Cl, 02h ; Lecture du secteur deuxième.
mov Es, Dx ; Offset [Es] de la zone mémoire.
Int 13h ; Notre interruption sur support de donnée.
(...)
jmp 7E00h ; Jump pour exécution du code précédement lu.

5 réponses

ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
27 août 2004 à 14:21
Salut,
Pour faire une telle opération résolu et controler régulièrement depuis belle lurette , inutile d'inventer la roue de nouveau.Se munir d'un désassembleur , éventuellement des symboles téléchargeables chez microsoft,et ........... c'est presque terminé.
ToutEnMasm
0
cs_Stormy Messages postés 255 Date d'inscription samedi 20 avril 2002 Statut Membre Dernière intervention 16 janvier 2007
27 août 2004 à 21:08
Je comprend pas ce que tu me dis. Tu es sûr de pas t'être trompé de post.
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
7 sept. 2004 à 14:56
salut,

si mes souvenirs sont bons,

dl = 80h pour peripheriques IDE
dl = 00h pour peripherique FLOPPY

(es = 0 a l'entrée du MBR)

xor cx,cx
mov ax,0201h ; lecture 1 secteur
mov es,cx ; maintenant c'est sur.
mov dx,cx ; si floppy
mov dl,80h ; si HDA (81h pour HDB)
mov bx, 7E00h
mov cl, ah ; charge le deuxieme secteur
Int 13h

si tu veux pas t'embeter, tape "int 13h" dans google
( valable pour n'importe quelle interruption )

@++
0
SystemOfAXav Messages postés 44 Date d'inscription dimanche 2 mai 2004 Statut Membre Dernière intervention 15 avril 2005
7 oct. 2004 à 11:48
Si mes souvenirs sont exacts, le numero du lecteur (HD ou disquette)
est dans le registre dl au démarage.

Le mieux c'est de le stocker dans un variable au tout début de ton code (avant de modifier dx)

Et tu le récupère quand tu veux charger ton noyau.

Sinon pour le reste, verifie que CS est bien à zero pour ton bootLoader:
c a d que ton code commence bien a 0x0000 : 0x7C00 et pas 0x07C0 : 0x0000
c ad que tu as mis org 0x7C00 et pas 0x07C0 (le bootloader va s'executer dans les deux cas.)

Mais pour le deuxième cas, je te conseille de mettre jmp 0x0 : 0x7E00.

Voili,voilou.....
@+

Voir Redmond (en flammes) et mourir !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_meganet Messages postés 1 Date d'inscription jeudi 9 novembre 2000 Statut Membre Dernière intervention 11 juin 2005
11 juin 2005 à 23:48
Salut,
voilà le code que j'utilise pour booter sur le 2eme secteur d'un disk quel qu'il soit!

%define BASE 0x100 ; 0x0100:0x0 = 0x1000
%define KSIZE 1


[BITS 16]
[ORG 0x0]


jmp start
%include "UTIL.INC"
start:
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,msgBoot
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


; initialisation du pointeur sur la GDT
mov ax,gdtend ; calcule la limite de GDT
mov bx,gdt
sub ax,bx
mov word [gdtptr],ax


xor eax,eax ; calcule l'adresse lineaire de GDT
xor ebx,ebx
mov ax,ds
mov ecx,eax
shl ecx,4
mov bx,gdt
add ecx,ebx
mov dword [gdtptr+2],ecx


; passage en modep
cli
lgdt [gdtptr] ; charge la gdt
mov eax,cr0
or ax,1
mov cr0,eax ; PE mis a 1 (CR0)


jmp next
next:
mov ax,0x10 ; segment de donne
mov ds,ax
mov fs,ax
mov gs,ax
mov es,ax
mov ss,ax
mov esp,0x9F000


jmp dword 0x8:0x1000 ; reinitialise le segment de code



;--------------------------------------------------------------------
bootdrv: db 0
msgBoot db "Chargement du noyau et passage en 32 Byte. Veuillez patianter...",13,10,0


;--------------------------------------------------------------------
gdt:
db 0,0,0,0,0,0,0,0
gdt_cs:
db 0xFF,0xFF,0x0,0x0,0x0,10011011b,11011111b,0x0
gdt_ds:
db 0xFF,0xFF,0x0,0x0,0x0,10010011b,11011111b,0x0
gdtend:


;--------------------------------------------------------------------
gdtptr:
dw 0 ; limite
dd 0 ; base



;--------------------------------------------------------------------
;; NOP jusqu'a 510
times 510-($-$$) db 144
dw 0xAA55

Voilà!
Et esque quelqu'un pourrai m'aider à faire un os open source?
Si quelqu'un est ok et si ça interresse quelqu'un tous sur:
http://forum.site-meganet.com/forum.php?fid=19.
Voilà!
Salut!

Il faut le compiler avec NASM.
Pour le télécharger pour windows avec le fichier util.inc aller sur:
http://serveur.site-meganet.com/os/compilateur.zip.
Voilà!
0
Rejoignez-nous