begin process at 2010 03 19 22:10:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Processeurs

 > 

X86

 > 

Mode protégé: impossible de faire un far jump ou de lancer un traitement d'interruption (erreur de pile engendrant une triple fault)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Mode protégé: impossible de faire un far jump ou de lancer un traitement d'interruption (erreur de pile engendrant une triple fault)

mercredi 3 juin 2009 à 22:15:30 | Mode protégé: impossible de faire un far jump ou de lancer un traitement d'interruption (erreur de pile engendrant une triple fault)

rdany62

Bonjour,
Pour mon projet tuteuré de DUT, j'ai besoin de démarrer un PC (n'importe quel processeur à partir du Pentium) sur un programme directement (c'est à dire sans Windows et de préférence sans Dos) pour gérer la surveillance des entrées sorties d'un automate programmable industriel par le biais d'une carte PCI.
L'automate est cablé, j'accède à la carte PCI et je lis et modifie l'état de mon automate sans problème grâce à des petits programmes de test que j'ai écrit (en démarrant le PC sans Dos et sans Windows, les programmes se comportent donc un peu comme un OS, sauf qu'ils ne permettent de rien faire d'autre).
Là où çà se corse, c'est quand je passe en Pmode, ce qui ce fait sans trop de difficultés. Le passage en pmode me permet de bénéficier du multi-tâche, me permettant ainsi de diviser le programme en plusieurs parties:
1. Scheduler de tâches, gestionnaire d'IRQ/ de mémoire, etc...
2. Les pilotes de bus
3. Les pilotes clavier/VGA/disquette/carte de communication à l'automate
4. Le programme en lui-même

Cette organisation me permet de modifier l'une des parties sans toucher aux autres, de plus, çà me permet de documenter séparément chaque partie (ce qui fait partie de mon cahier des charges).

Pour commencer en pmode, juste après le passage en pmode, j'initialise mes sélecteurs de segment, mon pointeur de pile de la manière suivante:

cli
masquage des ints au niveau des pics

Gate A20 à 1 par le contrôleur clavier

Gdt_ptr:
   addresse de le GDT
   longueur de la GDT: 0x18

GDT:
-descripteur 0x00: à 0 (cf doc Intel)
-descripteur 0x08: code lisible, exécutable, 'non conforming' (cf doc Intel), 32 bits, addresse de base: 0x0000 0000, addresse haute: 0xFFFF FFFF, ring 0, segment de 4Go
-descripteur 0x10: données lisibles, écriture autorisées, 'expand-up' (expansion vers le haut), 32 bits, addresse de base: 0x0000 0000, addresse haute: 0xFFFF FFFF, ring 0, segment de 4Go

Le modèle mémoire est donc de type flat.

Chargement du registre GDTR avec Gdt_ptr
Passage du bit 0 du registre CR0 à 1 (passage effectif en pmode)
short jump vers (sans code ni données entre la mise à 1 du bit 0 de CR0, cf doc Intel):
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov ss, ax
mov sp, 0x10000
nouveau short jump vers (sans code entre le mov sp et le code suivant):
chargement du registre IDTR avec idt_ptr

démasque des ints au niveau des pics

sti

idt_ptr:
   addresse de l'IDT
   longueur de l'IDT: 256*32

IDT:
   toutes les entrées sont initialisées en 'Interrupt Gate' avec l'adresse d'un IRQ Handler de test (il affiche un 'A' dans le coin supérieur gauche de l'écran puis iret) dans mon segment de code (pas de pb de ce côté à mon avis)

Ce n'est ici qu'un pseudo-code visant à expliquer au mieux le fonctionnement de mon code, et j'espère que c'est assez clair, sinon, dites le moi.

Voici le problème:
impossible de faire un far jump, impossible aussi de déclencher une interruption ni matérielle ni logicielle.
impossible aussi le lire quelque chose en faisant référence à cs de manière répétée (par exemple, impossible de faire: mov  ax, word [cs:esi] - sous Fasm).
Sous VmWare, j'ai une erreur de pile, puis reset. Sur un vrai PC, reset direct (l'erreur de pile doit se faire aussi)
En fait, je pense que l'erreur de pile se produit, provoquant une exception, nécessitanbt le traitement par la biais de l'IRQ Handler, mais il est inaccessible car il provoque lui aussi une erreur de pile, ce qui provoque une triple fault et donc un reset hard du processeur et le redémarrage du Bios.
Je ne vois pas trop où est le soucis, si quelqu'un pouvait m'éclairer, ce serait vraiment génial (çà m'éviterait de me taper une sale note en projet tuteuré... pour çà, il faudrait que çà marche).

Merci d'avance (et désolé pour la taille de ce post !)
vendredi 5 juin 2009 à 13:13:56 | Re : Mode protégé: impossible de faire un far jump ou de lancer un traitement d'interruption (erreur de pile engendrant une triple fault)

bofur

je me demande si ça ne vient pas du fait que le segment uttilisé par la pile ne doit pas etre un segment d'un type spécial, je n'ai pas la doc sous la main mais il m'as semblé qu'il y avait un truc a faire en plus pour le segment de pile

G.I.G.O.
vendredi 5 juin 2009 à 15:10:42 | Re : Mode protégé: impossible de faire un far jump ou de lancer un traitement d'interruption (erreur de pile engendrant une triple fault)

rdany62

OK, merci pour l'info, je reconsulte la doc, dans ce cas, ce doit être un descripteur de type système, sinon, c'est que la pile doit être dans un segment à part du segment de données.
Je repost pour dire quoi, à bientôt !
jeudi 16 juillet 2009 à 16:06:16 | Re : Mode protégé: impossible de faire un far jump ou de lancer un traitement d'interruption (erreur de pile engendrant une triple fault)

rdany62

Bonjour, voilà j'ai trouvé le problème: mon secteur de démarrage charge le code à une addresse définie, or je ne tenais pas compte de cette addresse et je chargeais tout ce qui est idt et gdt mais décalé, puisque mes pointeurs ne pointaient pas tout à fait au bon endroit. J'ai retesté sous Bochs sans le secteur de boot, çà marche nickel, et en cherchant un peu, j'ai compris çà...



Cette discussion est classée dans : code, erreur, impossible, pile, addresse


Répondre à ce message

Sujets en rapport avec ce message

Cherchez l'erreur [ par neo1012 ] Salut, J'ai commencé l'ASM il n'y a pas longtemps, et hier j'ai fait mom premier programme: jmp string code: pop ecx mov bl,1 mov dl,23 ;mov al,4 i AT&T erreur de compilation etc... [ par maminovadu75 ] Bonjour, j'aimerais me mettre a l'assembleur mais j'ai quelque problème.voici mon code morceau de code pour trier un tableau de int : ( mélange de C/C A l'aide... svp [ par monitor100 ] Bonjour a tous,Je suis completement null en assembler, et il faut que je fasse afficher le résultat de la factoriel de 4 soit 24.est ce que quelqu'un processeur à pile [ par ramzitligue ] salut, je travaille sur un processeur à pile(Forth),j'ai besoin d'un code source(asm)pour le tester.je prefere que le code contient des instructions c Création d'une lib sous tasm et linkage avec du code tc avec tlink [ par rdany62 ] Bonjour, Je cherche à créer une librairie statique avec tasm et la lier avec un code écrit avec turbo c. tout ce passe bien (assemblage, compilation e lecture de date au clavier asm [ par w120 ] salut!! je suis un déééééééébutant en langage assembleur j'ai essayé de le comprendre seul mais au niveau de l'application je trouve tant de diffucul programme assembleur [ par marwen09 ] je veux ecrire un programme assembleur qui recuper la date de system puis affecte dans jour le nombre de jour ,dans anne le nobre d'anne et dans moi s


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,856 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales