[SOS] Multi-Tasking - TSS
KAISER Edouard
edouard.kaiser at gmail.com
Jeu 15 Sep 18:34:48 CEST 2005
J'espère que ça ne vous dérange pas que je fasse un petit monologue et
que je pose des questions qui n'ont rien à voir avec SOS ! Si c'est le
cas pas de problèmes, j'essayerai de recentrer le sujet et faire un
parallèle avec SOS. (personellement dans ma tete je vois cette mailing
list un peu comme la mailing list FR du développement d'OS =) )
Donc voila, je continue dans mon problème de multitasking, en fait je
crois que le soucis vient de l'initialisation de mon TSS.
Je résume la situation : On a une LDT qui contient des descripteurs de
code, donné & stack. Ces descripteurs possède les privilèges les plus
élevés, donc pour l'instant aucun soucis de droit..
Les descripteurs de Code & Données décrivent une zone mémoire
commençant à 8Mo (adresse physique). Les 8 premiers Mo sont dédiés au
noyau.
La pile commence à 9Mo. (comme ça je suis bien sur que rien ne s'écrase...).
J'ai utilisé la méthode de SOS pour inclure un binaire ELF(qui fait
une simple interruption logicielle et boucle à l'infini..) dans les
sections du Kernel.
J'arrive à retrouver ce binaire ELF et je (pense ?) le copie au bon
endroit : juste aprés le noyau, donc à 8Mo, comme décrit dans la LDT
que je lui associe.
Première question :
Dans la section userland/link.lds, on indique au linker que le
programme sera chargé au premier 1Go dans SOS.
J'ai mis en pratique la meme chose pour mon OS, sauf que moi c'est 8Mo
donc 0x800000.
Cependant j'ai du mal à assimiler la chose. La segmentation tout comme
la pagination fait croire au processus qu'il est stocké au tout début
de la mémoire non ? (0x0), aprés c'est la MMU grace aux selecteurs de
segments qui se chargent de faire les bonnes opérations pour obtenir
des adresses physiques.
Alors pourquoi dire au Linker l'emplacement ou sera mis notre
executable en memoire ?
Pourquoi ne pas laisser 0x0, et aprés laisser faire à la MMU son
boulot et retravailler les adresses lors de l'execution ?
Deuxième question :
Il y a certains champs dans le TSS ou je ne sais pas du tout quoi
mettre parce que je ne comprends pas leur utilité, pourtant j'ai beau
relire la doc Intel, leur Anglais me laisse dans le flou.
Je parle de esp0, esp1 & esp2, respectivement ss0, ss1, ss2.
Quelle est l'utilité de ces champs pour le processeur ?
En ce qui concerne EIP, ce registre contient un offset n'est ce pas ?
Donc si dans le descripteur de segment de code qui commence à
0x800000, l'execution ne commence vraiment qu'a 0x800018 (header ELF
je présume ?), EIP devra valoir 0x18 non ?
J'essaye de débroussailler ce qui est flou pour voir ou j'ai faux et
vraiment cerner le problème. Parce que pour l'instant c'est pas encore
ça le changement de contexte :D
Merci à ceux qui auront la patience de me lire.
--
KAISER Edouard.
Wiki-Blog : http://kaiser.edouard.free.fr/
BesOS : http://besos.mtp.epsi.fr/
Plus d'informations sur la liste de diffusion Sos