Torito loader & isoemul

Soyez le premier à donner votre avis sur cette source.

Vue 12 656 fois - Téléchargée 617 fois

Description

il y a 2 sources distinctes assemblées pour obtenir une image ISO bootable.

tomiso.asm simule une structure iso de cd. ( seul les information de Type LSB sont indiquées )

torito.asm est un code mbr qui utilise les fonction etendues de l'interruption 13h ( fct 41h,42h )et la structure DEVICE ADDRESS PACKET ( cf ATAPI )

le tout permet de booter et de charger un loader de + de 500Ko

codé a l'aide de nasm.

il etait fait dans le but de le passer dans VMWare mais VMWare plante a l'execution du bootcom :-(
il est tj possible de graver le cd et de demarrer avec.

eprom.com est simplement le binaire du bootcom. ( source fournie sur ce site )
il y a juste une modification de mise a jour de la pile en entrée du bootcom etant donné que le code torito
ne permet pas d'avoir cs=ss=ds=es

personne ne sent venir le LiveCD ?

Conclusion :


merci a www.t13.org

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_patatalo
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.

@++
cs_patatalo
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



@++
sajaris
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.
sajaris
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
sajaris
Messages postés
63
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
1 août 2008
-
salut patatalo, cel fiat deux jours ;)

Encore une fois tu fais des merveilles, moi je pietine sur la table d'interruption apres passage en mode bios, je sais pas trop comment refaire ma table ou plutot j'en ai fait mais qui ne marche pas (alors j'ai pas su bien faire)

Mais cool pour toi. je demanderai encore de tes services, je continue de chercher d'abord(bah oui il faut d'abord soufrir pour trouver soi meme) si je n'aaarive pas alors je te pince ;)

A toute!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.