[SOS] Soft/Hard Task switching...

KAISER Edouard edouard.kaiser at gmail.com
Mar 8 Nov 22:36:21 CET 2005


Salut romain !
Tu voulais que je te parle un peu des TSS et du Hard Task-Switching
alors voila ;)

Déja un TSS c'est quoi, et bien c'est une structure de ce type :

/* Structure d'un TSS selon la documentation Intel */
struct tss_struct
{
    u16 back_link;    /* Selecteur de la tache qui a fait appel a elle */
    u16 reserved0;
    u32 esp0;
    u16 ss0;
    u16 reserved1;
    u32 esp1;
    u16 ss1;
    u16 reserved2;
    u32 esp2;
    u16 ss2;
    u16 reserved3;
    u32 cr3;
    u32 eip;
    u32 eflags;
    u32 eax, ecx, edx, ebx, esp, ebp, esi, edi;
    u16 es;
    u16 reserved4;
    u16 cs;
    u16 reserved5;
    u16 ss;
    u16 reserved6;
    u16 ds;
    u16 reserved7;
    u16 fs;
    u16 reserved8;
    u16 gs;
    u16 reserved9;
    u16 ldt;
    u16 reserved10;
    u16 debugtrap;    /* Bit qui lance une exception de debug si il
est place */
    u16 iomapbase;
} __attribute__ ((packed));


On voit bien que ça regroupe tout ce qui caractérise le contexte d'un
processus en cours d'éxécution (valeur des registres, etc...).

De ce fait si on se base sur le Hard-Task Switching il va falloir un
TSS par processus qui permettra de sauvegarder le contexte du
processus dans ce TSS.

Première contrainte : un TSS en mémoire doit avoir son entrée dans la
GDT, de ce fait on est limité en processus (8100 et quelques...). Mais
cette limite est cassable, j'ai de la documentation la dessus. Donc ce
n'est plus vraiment un probleme.
De ce fait on accede à un descripteur de TSS dans la GDT tout comme on
accede à un descripteur de segment à travers un sélecteur.

C'est la que je trouve l'architecture Intel géniale : il suffit de
faire un "ljmp <selecteur de TSS dans la GDT>" et le processeur
s'occupe de charger tout les registres avec les valeurs comprises dans
le TSS et donc de continuer l'éxécution à partir de la nouvelle valeur
d'EIP chargé.

Sauvegarde de contexte :
Ok jusque la on sait charger un nouveau contexte grace à un TSS mais
comment sauvegarder un contexte avant de passer à un autre ?
Rien de plus simple, lors d'un "ljmp <selecteur de TSS dans la GDT>"
le processeur récupère la valeur du registre TR (Task Register), ce
dernier contient le selcteur de TSS dans la GDT dans lequel il doit
sauvegarder le contexte actuel. Ce qu'il fera automatiquement lors
d'un appel à un nouveau TSS !

J'espère que c'est un peu plus clair, si y a un truc qui cloche,
n"hésiter pas ;)
-----------------------------
KAISER Edouard.
Wiki-Blog : http://kaiser.edouard.free.fr/
BesOS : http://besos.mtp.epsi.fr/


Plus d'informations sur la liste de diffusion Sos