Interruption qui passe en 32 bits ?

Résolu
vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 - 30 janv. 2006 à 18:50
vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 - 30 janv. 2006 à 23:03
Bonjour tout le monde,

dans le cadre du developpemet d'un micro OS, j'aurais voulu savoir s'il existe une interruption qui passe en Pmode (ou du moins en 32 bits), c'est en fait car je suis confornté à un probleme :

1- Le secteur de boot charge le noyau 32 bits
2- Le secteur de boot passe en Pmode
3- Execution du kernel

seulement il ne me reste plus assez d'octet pour la seconde partie........à moins que l'on peut avoir un code qui passe en 32 bits de maniere assez succintes (je veux juste que les instructions soient en 32 bits c'est tout)

voilà, en vous remerçiant à l'avance de votre intêret sur le probleme,

+

2 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
30 janv. 2006 à 21:22
salut,

j'ai reussi a loger le tout dans un secteur CD ( 2048 octets ) afin de lancer un loader directement en 32bits. Le code mbr peut tres bien lire les 3 secteurs suivants et le tour est joué ou bien charger un loader intermediaire.

sinon, la fonction 89H de l'interruption 15H permet le passage en PMODE par le BIOS par contre, tu dois quand meme specifier une GDT de 64 octets. La taille minimale de la GDT etant 8*4 = 32 octets, y'a peut etre une perte quand meme.

voila ce que j'ai de + petit pour le passage en pmode. La partie ldr32 doit pouvoir etre enlevée du code mbr, il te reste plus que ldr16 et la table GDT a prévoire ce qui doit faire moins de 64 octets en tout.

;******************************************************************************
align 4
GDT:
dd 0
db 0
dw DESC_NUL
db 0

FLAT_CODE0 EQU $-GDT
gdt_01:
dw -1
dw 0
db 0
dw DESC_C32+0x0F00
db 0

FLAT_DATA0 EQU $-GDT
gdt_02:
dw -1
dw 0
db 0
dw DESC_D32+0x0F00
db 0
gdt_03:
dd 0,0
GDT_size EQU $-GDT
GDTR:
dw GDT_size-1
dd GDT
IDTR
dw 0
dd 0
;******************************************************************************
[BITS 32]
ldr32:
mov ax,FLAT_DATA0
mov ss,ax
mov ds,ax
mov es,ax
movzx eax,word [(SEG_PRIDESC*16)+VD_PRIMARY.appuse+TOM.exseg]
movzx edx,word [(SEG_PRIDESC*16)+VD_PRIMARY.appuse+TOM.exoff]
lea eax,[eax+eax]
lea eax,[edx+eax*8]
mov esp,eax
jmp dword [eax]
;******************************************************************************
[BITS 16]
ldr16:
cli
in al,0x70
or al,0x80
out 0x70,al
lgdt [GDTR]
lidt [IDTR]
mov eax,cr0
or al,1
mov cr0,eax
jmp FLAT_CODE0:ldr32

@++
3
vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 3
30 janv. 2006 à 23:03
ok, merci beaucoup avec 30 octet de libre je vais essayer de faire un truc !



merci encore, @+
0
Rejoignez-nous