[Kos-dev] Ca avance ...

Thomas Petazzoni kos-dev@enix.org
20 Feb 2002 19:45:30 +0100


Salut,

Depuis aujourd'hui j'ai une primitive fat_open_file qui permet
d'ouvrir un fichier sur une partition FAT, ainsi que fat_read_file qui
permet de lire un fichier d'une partition FAT.

De plus j'ai compile sous Linux (avec GCC et un script adequat pour
LD) un executable ELF. Je l'ai ensuite place sur une partition FAT,
puis charge dans KOS. Le fichier se charge parfaitement. J'arrive meme
a l'executer !

Voici le source du programme :

int print(unsigned char *str)
{
  while(*str != '\0')
   asm("outb %b0,%w1"::"a"(*str++),"Nd"(0xE9)); 
   
  return 0;
} 

int main(void)
{
 print("KOS CPL3");
 print("Thomas");
 for(;;);
 return 0;
}

Ce programme est donc une application normale qui tourne sous KOS ! Et
en CPL3 ! Oui, oui !

Bon maintenant les mauvaises nouvelles :
* pour l'instant j'arrive pas a revenir de l'execution de ce
thread. Aka quand je me fait rescheduler, bin je me choppe un PAGE
FAULT sur la pile noyau (=> Double Fault), pour une raison encore
inconnue. Pourtant l'adresse de la pile est tout a fait
normale. Encore plus etrange, je me choppe ca juste au moment ou je
fais le changement de CR3 (chgt de contexte)... Bizarre, bizarre. Je
pense que Bochs va m'aider un peu ;)
* lorsque je mets un message genre :

  asm("movl %%esp, %0":"=r"(stack_addr));
  __dbg_printk("Next thread CPU context : 0x%x (0x%x)\n", 
               (unsigned) thread->cpu_context.cpl0,
               stack_addr);

dans la fonction set_current_thread, alors tout part en live : 

we're in kernel start
lookup_sym(0x2004baea) => stdlib.ro:console_printk+0x2a.
lookup_sym(0xdeadbeef) => <not in a module (0xdeadbeef)>.
lookup_sym(0x2005dd45) => <not in a module (0x2005dd45)>.
Next thread CPU context : 0x40002fb8 (0x200b6f40)
Next thread CPU context : 0x40002fb8 (0x40002f54)
Next thread CPU context : 0x40002fb8 (0x40002f54)
Next thread CPU context : 0x40002fb8 (0x40002f54)

Il lance donc bien le kernel_start, mais n'arrive jamais dans
primary_thread. Il me fait des "Next thread CPU context : 0x40002fb8
(0x40002f54)" pendant un bon moment, puis s'arrete sur :

[kmsg_send@_kmsg.c:52] **** System Halted **** :
Assertion port != NULL failed

Bizarre ! J'ai regarde les kmsg ne sont utilise que par l'interruption
timer... Peut etre un probleme de synchro.

Pour le premier probleme, je vais essayer de proteger arch/mm (tout ce
qui concerne le mapping) par un mechant spinlock, parce que vu le
nombre de threads qui font des choses bizarres qu'on commencent a
avoir, ca m'etonnerait pas que ca commence a couilloner de ce cote la
;)

Voila pour les nouvelles. Bien sur des que ca marche, je committe,
avec la methode pour creer votre appli KOS sous Linux, la compiler, la
mettre sur une image de disque et tout ca ;)

Thomas
-- 
PETAZZONI Thomas - thomas.petazzoni@enix.org - UIN : 34937744
(Perso)      http://www.enix.org/~thomas/
(KOS)        http://kos.enix.org/ 
(Club LinUT) http://club-linut.enix.org