TORITO LOADER & ISOEMUL

Signaler
Messages postés
12
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
16 juillet 2007
-
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35438-torito-loader-isoemul

Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,


tu n'as effectivement pas besoin de reinitialiser tes segments plusieurs fois. Tu peux le faire n'importe ou a partir du moment ou il ne sont pas utilisés. C'est a dire, pas longtemps quand meme car sinon pas d'acces memoire.

n'oublie pas non plus d'initialiser ta pile. Je n'ai pas trouvé quelle valeure elle avait dans ton code.

quand tu utilise les fonctions rep movs,cmps,scans, verifie ton flag de direction, tu pourrait copier dans la mauvaise direction sans meme t'en appercevoir. En general, il n'est pas modifié mais gerer c'est prevoir...

tu devrais vraiment profiter d'avoir des ORGS pour mettre plein de trucs en dur, apres le loader, y'auras plus d'ORG donc là d'accord, tout en dynamique.

@++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut Sajaris,

quelques petits details sont effectivement a revoir, je te conseille vivement de bien lire la doc intel avant de te lancer dans ce genre de travail, tu y gagneras de ton temps.

pour l'initialisation des registres GDTR et IDTR, ce n'est pas la taille qui est indiquée dans le registre mais la limite. (taille-1)

les tables IDT et GDT devraient peut-etre etres alignées sur un DWORD

je ne te conseille pas non plus de garder la valeure BIOS 0x70 pour le pic slave mais de regrouper toutes tes HWI par exemples juste apres les exceptions:
00-1F:EXCEPTIONS
20-2F:HWIS (ou ailleurs mais regroupé)
30-FF:SERVICES KERNELS

de toute façon, le bios ne pourra pas utiliser la table IDT et les interruptions BIOS seront simulées par ton code kernel.

je serais toi, je creerai d'abord un truc déjà tout initialisé en dur dans le code et ensuite, je créerai eventuellement des fonctions dynamiques d'initialisation. N'oublie pas que ça doit aller vite quand le pic est désactivé. Une solution serait de generer une gestion minimum en dur. Ensuite, en dynamique, tu lui rajoute des fonctionnalitées (setHwi, setException, setService...)
cela te permettra de gerer les exceptions, cela te facilitera tj le deboguage. C'est encore plus utile si tu mange sur ton sommeil pour coder ton kernel ;-)

tu as également oublié de désactiver l'interruption NMI par le port 70h, cette interruption a tres peu de chance d'arriver mais si cela ce produit -> reset, elle n'est pas désactivée par un cli.

Est-il normal que tu n'ai pas d'ORG à ton code BOOT ?

il me semble que c'est l'inverse, tu accede ici au registre IMR du pic, elle sont activées quand a 0. A verifier quand meme, je n'ai rien sous les yeux.
;masquage des IRQ
mov al,0h
out 21h,al
%endmacro



@++
Messages postés
63
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
1 août 2008

bonjour,

je voulais signaler que mes erreurs ont disparu, c'etais en fait a cause d'adresse mal gerer (je mettais des [] qui donne la valeur alors que je voulais utiliser les adresses a ces emplacement).

Donc tout va bien, quand j'acrive les inteeruption apres initilaistation des PIC et IDT, aucun plantage.

Maintneant l'interruption clavier ne donne pas et l'horloge ne semble pas fonctionner.
Messages postés
63
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
1 août 2008

salut,

cela fait un bail. je reviens avec un probleme que je rencontre depuis 3 semaine avec mon passage en mode protege et l'initialisation de mon IDT. franchement je bute. j'ai tester toutes les combinaison possibles.

je donne le code et je le detaille pour etre mieu compris:

*************************** LE BOOT: ****************************

jmp start:

gdt:
db 0,0,0,0,0,0,0,0

gdt_cs:
db 0xFF,0xFF,0h,0h,0h,10011011b,11011111b,0h ;type=11 pous cs

gdt_ds:
db 0xFF,0xFF,0h,0h,0h,10010011b,11011111b,0h ;type=3 pour ds

gdt_ss:
db 0xFF,0xFF,0h,0h,0h,10010111b,11011111b,0h ;type=7 pour ss

gdt_end:

gdt_ptr:
dw 0000h
dd 0

start:
PRINT_TXT kerLoadLabel ;on affiche chargement de kernel

;---------------------initialisation de la structure de la GDT(limite,base)
;----Calcul de la Limite de la GDT
mov ax,gdt_end
mov bx,gdt
sub ax,bx
mov word[gdt_ptr],ax

;-------calcul de la base de la GDT segment*16 + offs
xor eax,eax ;init reg 32 bit
xor ebx,ebx
mov ax,ds ;recuperation du seg en decimal
shl eax,4 ;seg*16
mov bx,gdt
add eax,ebx
mov dword[gdt_ptr+2],eax

;--------------FIN DE LA FABRICATION DE LA GDT---
cli

lgdt [gdt_ptr]

;passage en mode protegé. Il faut mettre le bit 1 du registre cr0 a 1
mov eax,cr0
or ax,1
mov cr0,eax

jmp 08h:2000h;saut vers la memoire ou le nouyau a ete charger

voila c'est finit pour le boot, j'espere avoir bien commenté. jusque la ca va pour le boot, je le donne au cas ou vous avez d'autres suggestion, ou si je m'y suis mal pris. au passage je dirai que j'initialisait les segment ds,es,... avec leur adresse selecteur (10h) avant le saut vers le noyau, mais ce n'est pas indispensable car ca marche apres dans le kernel meme si je ne le fait pas(ce n''est pas indispensable car dans le kernel je refais tout)

On passe au noyau(que j'appel kernel).

**************************** NOYAU 32 BITS *********************
[BITS 32] ; instruction sur 32 bit
[org 0x2000] ; offset de depart

jmp start
%define IDTBASE 0h
%define GDTBASE 800h

%define INT_FLAG 0x8E
%define TRAP_FLAG 0x8F
%define COM_FLAG 0x80

%include "utils/pic.inc" ; initilaise le PIC.
%include "utils/macro.inc" ; pour utilisit la fonction gateInit

;initiazlise les selecteur apres saut a partir du boot
start:
mov ax,10h ; la gdt_ds
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax

cli ; on desactive tout
;
;-------initialisation de la structure de la GDT(limite,base)
;----Calcul de la Limite de la nouvelle GDT
mov ax,gdtmp_end
mov bx,gdtmp
sub ax,bx
mov word[gdtmp_ptr],ax
xor ecx,ecx

;-------base de la GDT
mov ecx,dword[GDTBASE]
mov dword[gdtmp_ptr+2],ecx

;--------------TRANSFERT GDT (on copie gdtmp a GDTBASE)
xor ecx,ecx
mov cx,word[gdtmp_ptr]
xor esi,esi
xor edi,edi
lea si,[gdtmp]
lea di,[GDTBASE]
rep movsb

lgdt [gdtmp_ptr]; on charge la GDT

jmp 08h:next1 ; petit saut d'initialisation

next1:
mov ax,10h ;
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax

;---------------initialisation de la structure de la IDT(limite,base)
;----Calcul de la Limite de la IDT
mov ax,800h ; je reserve l'espace pour les 256 interruption
mov word[idt_ptr],ax ; j'ai l'impression que ca plante ici.car si je met un jmp $ avant cette instrtuction, il n'y pas plantage
xor ecx,ecx

;-------base de la IDT
mov ecx,[IDTBASE]
mov dword[idt_ptr+2],ecx

;---------------TRANSFERT IDT
xor ecx,ecx
mov cx,word[idt_ptr]
xor esi,esi
xor edi,edi
lea si,[idt]
lea di,[IDTBASE]
rep movsb

lidt [idt_ptr]; on charge l'IDT

initPIC ; appel de la fonction initPIC contenu dans le fichier pic.inc ci dessous
gateInit 8h,interrupt,INT_FLAG,0,IDTBASE+8h*112 ; appel de la fonction gateInit definti dans le fic

sti
ker:
mov byte[0xB8002],'E'
mov byte[0xB8003],57h
mov byte[0xB8004],'L'
mov byte[0xB8005],57h
mov byte[0xB8006],'L'
mov byte[0xB8007],57h
mov byte[0xB8008],'O'
mov byte[0xB8009],57h

mov byte[0xB800A],' '
mov byte[0xB800B],57h

mov byte[0xB800C],'W'
mov byte[0xB800D],57h
mov byte[0xB800E],'O'
mov byte[0xB800F],57h
mov byte[0xB8010],'R'
mov byte[0xB8011],57h
mov byte[0xB8012],'L'
mov byte[0xB8013],57h
mov byte[0xB8014],'D'
mov byte[0xB8015],57h

jmp $

;-------------LES DONNEES UTILISEES
gdtmp:
db 0,0,0,0,0,0,0,0

gdtmp_cs:
db 0xFF,0xFF,0h,0h,0h,10011011b,11011111b,0h ;type=11 pous cs

gdtmp_ds:
db 0xFF,0xFF,0h,0h,0h,10010011b,11011111b,0h ;type=3 pour ds

gdtmp_ss:
db 0xFF,0xFF,0h,0h,0h,10010111b,11011111b,0h ;type=7 pour ss

gdtmp_end:

gdtmp_ptr:
dw 0000h
dd 0

;---------------------- IDT
idt:
times 256 dw 0,0,0,0
idt_end:

idt_ptr:
dw 0000h
dd 0h

interrupt: ; utiliser pour initialiser les interruption

mov al,20h
out 20h,al
iret

************************** INITAILISATIOn DU PIC APPELELE DANS LE KERNEL ***********

%macro initPic 0
;---MAITRE
;-----Initilaise le maitre
mov al,11
out 20h,al
jmp .1
.1
;------La base des interruptions. Ici 32=20h. On laisse en fait 32 interruption exception
mov al,20h
out 21h,al
jmp .2
.2
mov al,04h
out 21h,al
jmp .3
.3
mov al,1h
out 21h,al
jmp .4
.4
mov al,0h
out 21h,al

;---SLAVE
;-----Initilaise l'esclave
mov al,11
out 0A0h,al
jmp .5
.5
;------La base des interruptions. Ici 112=70h. On laisse en fait 112 interruption exception
mov al,70h
out 0A1h,al
jmp .6
.6
mov al,02h
out 0A1h,al
jmp .7
.7
mov al,1h
out 0A1h,al
jmp .8
.8
mov al,0FFh
out 0A1h,al

;masquage des IRQ
mov al,0h
out 21h,al
%endmacro

********************GATEINIT: FONCTION D'INITIALISATION DE LA IDT ***************

%macro gateInit 5 ;selecteur(16), offset(32),type(8), wx(5/8), adresse(32)
push eax
;selecteur
mov word[%5+2],%1
;offset
mov eax,%2
mov word[%5],ax
shr eax,16
mov word[%5+6],ax
;type
mov byte[%5+5],%3
;wc
mov byte[%5+4],%4
and byte[%5+4],00011111b

pop eax
%endmacro

****************************** FIN ********************

Bon voila ce que je n'ai pas fait ou fait:
--->je n'ai pas initilaiser toutes les interruptions
---> j'ai d'abord initlisaer la GDT apvant l'IDT

Voila, si vous pouvez me donner mes erreurs et comment bien procéder pour gerer les interruption.

MERCI
Afficher les 37 commentaires