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 29/05/2011, 18h24   #1
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
Par défaut execution de fonction bios en mode protégé

bonjour a tous!
je suis en train de programmer une version en mode protégé de mon petit système d'exploitation mais je me heurte a un petit problème

je doit faire appel a des fonction du bios pour pouvoir:
- lire le secteur d'une disquette (ou d'une clef USB)
- écrire dans le secteur d'une disquette
- obtenir des info VESA sur la carte video
- changer de mode video VESA
- changer le chunk video accessible

or tout le monde sait que l'on ne peut pas appeler de fonction bios en mode protégé, je repasse donc en mode réel le temps d'appeler l'interruption

MAIS ça ne marche pas! ou plus exactement j'arrive a passer en mode réel et a revenir en mode protégé mais dès que je j'appelle une interruption en mode réel ça plante

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
 
;***************************
appb:                 ;appel des fonctions lié au bios
cli
push ebx
push ecx
push edx
push esi
push edi
push ds
push es
push fs
push gs
 
mov dx,10h 
mov ds,dx
lidt[r_idt]          ; charge la gdt et l'idt sauvegardé
lgdt[r_gdt]          ;
mov edx,cr0
and dx,0FFFEh
jmp $+2
mov cr0,edx
jmp 6000h:fctreel   ;saut ou sont installé les fonction en mode réel 
                  ;suivant l'adressage mémoire du mode réel
finappb:
mov dx,18h
mov ss,dx
pop gs
pop fs
pop es
pop ds
pop edi
pop esi
pop edx
pop ecx
pop ebx
sti
ret
 
;****************************
;fonction execut‚ en mode réel  
fctreel:
mov dx,5000h
mov ds,dx
mov es,dx
mov fs,dx
mov gs,dx
mov dx,4000h
mov ss,dx
 
;ici je met l'interruption que je souhaite appeler (avec les bon paramètres)
 
rtrnmp:   ;retourne en mode protégé
mov dx,6000h 
mov ds,dx
lidt[p_idt]
lgdt[p_gdt]
mov eax,cr0
or eax,1
jmp $+2
mov cr0,eax
jmp 10h:finappb
est ce que quelqu'un aurait une idée de ce qui pourrait foirer?
bifur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 14h38   #2
edfed
Membre chevronné
 
Avatar de edfed
 
être humain
Inscription : décembre 2007
Messages : 471
Détails du profil
Informations professionnelles :
Activité : être humain

Informations forums :
Inscription : décembre 2007
Messages : 471
Points : 619
Points : 619
salut bifur, à quoi ressemble ta gdt et ton passage au mode protegé? c'est surtout cette etape qui determine si tu arriveras à exploiter les interruptions mode reel depuis le mode protegé.

si tu veux, j'ai un code fonctionnel pour ça, c'est DEX qui à ecrit la partie mode reel> mode protegé> mode reel, et ça fonctionnait très bien. par contre, faut etre logué pour down le fichier.




pour jouer en mode reel ET en mode protegé dans le meme code, il faut non seulement sauvegarder le IDTR du mode reel (IDTR -> IVT: linear 0, limit 400h), veiller à ne pas écrire dans les zones de ROM/BIOS (linear 0C0000h to 0FFFFFh) et BDA (linear 400h to beaucoup).

en gros, n'utiliser qu'entre un et six segments de 64 k de la ram basse. pour le code coté mode reel et les structures (GDT, IDT, disk buffer, etc...).
si DOS n'est pas chargé, la mémoire utilisable sans probleme est située entre linear 10000h et linear 8FFFFh (segments entre 1000h et 8000h).
les autres, il faut faire gaffe à ne pas toucher aux diverses choses bios/dos/ebios/boot...


pour le code et les données mode protegé, faudra privilegier la ram haute (au dessus de 1 mega octets)
__________________
http://www.pending.me.uk/nmc/bla_1356091200.png
Vivement 21/12/2012
edfed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 20h17   #3
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
mon passage en mode protégé est une copie conforme de ce qui est utilisé dans le code que j'avais montré, excepté que je sauvgarde la gdt et l'idt/ivt du mode réel c'est a dire:

Code :
1
2
3
4
5
6
7
8
9
10
 
sidt[r_idt]
sgdt[r_gdt]
 
lidt[p_idt]
lgdt[p_gdt]
mov eax,cr0
or eax,1
jmp $+2
mov cr0,eax
pour ce qui est de ne pas écrire n'importe ou dans la ram je me contente d'utiliser la zone de F800h à 8FFFFh

en faisant certains essais sur la totalité du code je suis certain que le problème vient de l'IVT du mode réel, il est modifié par le passage en mode protégé mais n'est pas correctement restauré lors du mini passage en mode réel
bifur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h18.


 
 
 
 
Partenaires

Hébergement Web