[SOS] Secteur de boot

Thomas Petazzoni thomas.petazzoni at enix.org
Sam 8 Jan 20:11:58 CET 2005


Salut,

Chris wrote:

> Je suis en train de faire un secteur de boot qui passe en mode protégé
> mais j'ai des problèmes (reboot après 3 exceptions cf. Bochs output).
> Est-ce que qqun pourrait me dire ce qui ne va pas ? Le problème survient
> au jump vers l'OS. Je suis un peu pressé par le temps (projet à terminer
> assez vite).

J'ai lu rapidement ton code. J'ai peut être trouvé quelque chose, mais 
rien de sûr. Je ne l'ai ni compilé, ni éxécuté. Donc c'est juste une 
supposition.

Dans ce genre de cas, il serait plus simple que tu envoies un tarball de 
tout ce qu'il faut pour que ça compile, avec le Makefile et tout ça.

Juste pour information, dans ce genre de cas, ce que j'avais pour 
habitude de faire quand ça plantait, c'est de modifier les sources de 
Bochs (ici les sources de l'instruction jmp par exemple), pour rajouter 
des printf() un peu partout, et savoir qu'est-ce qui faisait planter. Ça 
m'a permis de résoudre pas mal de problèmes.

> k_launch: 
> ;jmp $ ; Uncomment this for testing 
> ;jmp KSEG:0 ; give the hand to the kernel 
> jmp 1000h 

Dans le bootsecteur de SOS, on fait ici un saut long, en donnant 
explicitement le sélecteur de segment de la GDT.

Essaie de faire

jmp SYS_CODE_SEL:1000h

pour voir.

(Comme je l'ai dit, c'est juste une simple supposition. Il peut y avoir 
de nombreuses autres raisons).

Juste une remarque : SYS_DATA_SEL et SYS_CODE_SEL chez toi valent 
l'offset du segment dans la GDT. En fait, les registres de sélecteur de 
segment ne doivent pas contenir l'offset dans la GDT, mais l'index des 
segments (pour toi ça sera 1 pour le code et 2 pour les données). Mais 
comme cet index est décalé de 3 bits, cela fonctionne. Les 3 bits de 
poids faible sont à zéro dans ton cas (un bit pour sélectionner la GDT 
plutôt que la LDT, 2 bits pour dire que tu es en niveau de privilège 0). 
Donc ici, ça fonctionne bien, mais méfies-toi : un sélecteur de segment, 
ce n'est pas l'offset du segment dans la GDT, mais :

  ((index du segment dans la GDT)        << 3) |
  ((0 si GDT, 1 si LDT)                  << 2) |
   (niveau de privilège : 0, 1, 2 ou 3))

Se référer à la documentation Intel pour plus de détails.

Si le problème ne vient pas du saut long, renvoie une version complète 
du bazar qu'on puisse compiler et éxécuter.

Bonne soirée,

Thomas
-- 
PETAZZONI Thomas - thomas.petazzoni at enix.org
http://thomas.enix.org - Jabber: thomas.petazzoni at jabber.dk
KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E  1624 F653 CB30 98D3 F7A7
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 256 bytes
Desc: OpenPGP digital signature
Url : http://the-doors.enix.org/pipermail/sos/attachments/20050108/4fd3d862/signature.pgp


Plus d'informations sur la liste de diffusion Sos