[Kos-dev] Comportement étrange ...

Thomas Petazzoni thomas.petazzoni at enix.org
Wed Sep 29 00:35:19 CEST 2004


Salut,

J'ai un comportement assez étrange dans Bochs lors du partage de
pages. Si ça se trouve, je me plante complètement, je ne sais
pas. Enfin voilà ce qui se passe :

 1) J'alloue une page physique d'adresse pa
 2) Je mappe cette page physique à une adresse virtuelle va
 3) Je mappe de nouveau cette même page physique à une adresse
    virtuelle va2
 4) J'écris un mot (au harsard 0xDEADBEEF) dans la page située à
    l'adresse va.
 5) Je relis ce même mot, mais via la page va2.

Si je ne mets rien entre 4 et 5, alors à la lecture du mot via va2
j'ai 0x0. Si je mets une boucle for() de 2 itérations, j'ai toujours
0x0. Si je mets 3 itérations, j'ai la bonne valeur 0xDEADBEEF. Si je
mets un asm("nop"), j'ai également la bonne valeur 0xDEADBEEF.

J'ai testé avec la version de KOS sans mes modifications, j'ai le même
comportement. Je n'ai pas vérifié sur machine réelle.

Si vous voulez tester, voilà le code qu'il faut rajouter juste après
create_kernel_thread(NULL, thread_which_ends, NULL) dans la fonction
primary_thread() de modules/kos/wolfgang.c :

  {
    result_t result;
    vaddr_t va = 0x4000000;
    vaddr_t va2 = va + PAGE_SIZE;
    unsigned *data;
    paddr_t pa1 = get_physical_page(PHYS_PAGE_KERNEL,
    PHYS_PAGE_NON_SWAPPABLE);

    result = map_virtual_page(NULL, va, pa1, VM_ACCESS_READ |
    VM_ACCESS_WRITE);
    __dbg_printk(" - 0x%x => 0x%x : %d\n", pa1, va, result);
    result = map_virtual_page(NULL, va2, pa1, VM_ACCESS_READ |
    VM_ACCESS_WRITE);
    __dbg_printk(" - 0x%x => 0x%x : %d\n", pa1, va2, result);

    data = (unsigned *) va;
    data[123] = 0xDEADBEEF;

    {
      int j;
      /* Si je mets 2, alors la valeur lue est 0x0, si je mets 3,
         alors c'est 0xDEADBEEF */
      for (j = 0; j < 2; j++) { j++; j--; }
    }

    data = (unsigned *) va2;

    __dbg_printk("Reading shared data : 0x%x\n", data[123]);

    while(1);
  }

A priori, ce n'est pas une question de TLB, car tout cela se passe sur
2 adresses virtuelles différentes.

Par contre : je remarque que si je mets ce code avant que les threads
ne soient créés (et donc avant qu'il y ai du scheduling, c'est à dire
au tout début de KERNEL_START), alors il n'est pas nécessaire d'avoir
la quelconque instruction entre l'écriture via va et la lecture via
va2 pour récupérer la bonne valeur.

Il est tard, peut être que je n'arrive pas à comprendre ce qui se
passe, si vous avez une explication, ça m'intéresse ;-)

Sinon au niveau de l'avancement, j'ai donc maintenant vmap + rmap qui
remarchent : j'arrive à démarrer KOS avec les threads qui
tournent. Pour l'instant, c'est une version light de KOS, sans Karm,
sans drivers, sans applications user-space, sans team différentes,
etc.. Je pense pouvoir faire revenir tout cela assez rapidement, et
embrayer ensuite sur le vrai boulot : VMM ;-)

Tiens pendant que j'y suis, si il y a des gens calés en Linux et DMA :
http://marc.theaimsgroup.com/?l=linux-kernel&m=109636625925351&w=2

Bonne nuit,

Thomas
-- 
PETAZZONI Thomas - thomas.petazzoni at enix.org 
http://thomas.enix.org - Jabber: kos_tom at sourcecode.de
KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E  1624 F653 CB30 98D3 F7A7


More information about the Kos-dev mailing list