[SOS] Multi-Tasking - TSS

KAISER Edouard edouard.kaiser at gmail.com
Mer 28 Sep 12:28:00 CEST 2005


Aucun soucis David, désolés de pas avoir été trés clair ;)

Voila exactement le code du programme utilisateur :

void main(void)
{
	__asm__("int $0x30");
	while(1);
}

Je le fais boucler car je n'ai pas encore code le retour dans le
runtime C.... mais peu importe la n'est pas le probleme. Il y a donc
un appel direct à l'interruption : 0x30.

Maintenant qu'est ce qui caractérise l'int 0x30.

Voila l'appel pour initialiser l'int 0x30 (la numero 48 donc...) dans l'IDT :

On donne l'adresse de _sys_call (fonction ASM de mon mail precedent),
le selecteur de segment de code en mode noyau (0x08) et j'indique
l'emplacement dans mon tableau (IDT) ou il faut initialiser les champs
avec les informations.

init_idt_syscall_entry((unsigned int)_sys_call, 0x08, &(idt[48]));

Code de cette fonction :
/* Initialisation d'un descripteur d'interruption logicielle
accessible pour l'utilisateur */
void init_idt_syscall_entry(u32 Offset, u16 Seg_Select, struct
x86_idt_entry* Gate)
{
    Gate->offset0_15 = (Offset & 0xffff); /* 16 premiers bits Offset */
    Gate->seg_select16_31 = Seg_Select;   /* 16 bits : selecteur de
descripteur de segment */
    Gate->reserve32_36 = 0;
    Gate->flag37_39 = 0;
    Gate->type40_42 = 0x6;                /* 3 bits pour le type :
Interrupt Gate    */
    Gate->data_size43 = 1;                /* Taille des instructions,
1 : 32 bits        */
    Gate->zero44 = 0;                     /* Libre pour nous les
developeurs !           */
    Gate->dpl45_46 = 3;                   /* DPL 3 pour etre appelle
par l'utilisateur ! */
    Gate->present47 = 1;                  /* 1 : Present en memoire   
                  */
    Gate->offset48_63 = (Offset & 0xffff0000) >> 16; /* 16 derniers
bits de l'offset     */
}


Voila comment est initialisé l' int 0x30.

Maintenant le _sys_call et la fonction haut niveau qu'il appelle :
 _sys_call:
        push %ds
	push %es
	push %fs
	mov $0x10,%edx /* Selecteur du descripteur de donne du noyau dans la GDT */
	mov %dx,%ds
	mov %dx,%es
        call sys_call
	pop %fs         /* On replace les segments donnes du user mode */
	pop %es
	pop %ds
    iret            /* Retour d'interruption */

/* Fonction d'interruption logicielle haut niveau en C */
void sys_call(void)
{
   put_string("Software interrupt !");
}

Voila rien d'extraordinaire, juste un affichage de texte !

J'espère avoir été un peu plus clair, si tu veux d'autres informations
n'hésite pas !
Merci.
--
KAISER Edouard.
Wiki-Blog : http://kaiser.edouard.free.fr/
BesOS : http://besos.mtp.epsi.fr/


Plus d'informations sur la liste de diffusion Sos