[SOS] Accusé de réception.
Cyril Dupuit
cyrildupuit at hotmail.com
Jeu 12 Mai 14:49:46 CEST 2005
Salut,
Au fait, j'attends la réponse concernant les bogues potentiels de SOS. Je
suis désolé de ne pas avoir pris le chemin de la liste de diffusion. Voici
chose faite.
paging.c :
Dans la fonction : sos_paging_set_prot_of_interval
Vous avez écrit :
{
if (! SOS_IS_PAGE_ALIGNED(vaddr)) return -SOS_EINVAL;
if (! SOS_IS_PAGE_ALIGNED(size)) return -SOS_EINVAL;
for ( ; size >= SOS_PAGE_SIZE ; vaddr += SOS_PAGE_SIZE, size -=
SOS_PAGE_SIZE)
sos_paging_set_prot(vaddr, new_prot);
}
Problème : Je ne suis pas d'accord avec le fait qu'un bloc complet contienne
des adresses mappées. C'est à dire que la fonction sos_paging_set_prot()
peut retourner SOS_VM_MAP_PROT_NONE. Dans ce cas, il ne sert à rien de
définir une protection à une page non mappée.
Je vous demande confirmation.
I8254.h :
Pour protéger de l'inclusion multiple, vous avez écrit :
#ifndef _SOS_i8259_H_
#define _SOS_i8259_H_
L'entête du fichier i8259.h contient aussi cette définition.
Dans certains fichiers (paging.c), vous vous servez d'une macro d'assertion.
Ce qui me dérange, c'est que cette assertion contient du code. Que se
passera-t'il lorsque l'assertion sera retirée par le préprocesseur dans une
version « Realease » de SOS.
Exemple :
if (vpage_vaddr < SOS_PAGING_MIRROR_VADDR)
{
SOS_ASSERT_FATAL(SOS_OK == sos_mm_context_synch_kernel_PDE(index_in_pd,
u.ui32));
}
else
{
pd[index_in_pd] = u.pde;
}
En compilation « Realease », il ne reste plus que ça :
if (vpage_vaddr < SOS_PAGING_MIRROR_VADDR)
{
}
else
{
pd[index_in_pd] = u.pde;
}
L'appel à la fonction sos_mm_context_synch_kernel_PDE() a disparu.
Veuillez ne pas prendre en considération ce message si vous n'avez pas
l'intention de faire une version « Realease » de SOS.
mm_context.c :
Dans la fonction sos_mm_context_create(), vous avez écrit :
mmctxt = (struct sos_mm_context*)
sos_kmem_cache_alloc(cache_struct_mm_context, 0);
if (NULL == mmctxt) return NULL;
mmctxt->vaddr_PD = sos_kmem_vmm_alloc(1, SOS_KMEM_VMM_MAP);
if (mmctxt->vaddr_PD == 0)
{
sos_kmem_cache_free((sos_vaddr_t) mmctxt);
return NULL;
}
mmctxt->paddr_PD = sos_paging_get_paddr(mmctxt->vaddr_PD);
if (mmctxt->paddr_PD == 0)
{
sos_kmem_cache_free((sos_vaddr_t) mmctxt);
return NULL;
}
if (SOS_OK != sos_paging_copy_kernel_space(mmctxt->vaddr_PD,
current_mm_context->vaddr_PD))
{
sos_kmem_cache_free((sos_vaddr_t) mmctxt);
return NULL;
}
Vous allouez un bloc mémoire pointé par mmctxt. Ensuite, vous allouez 1 page
mémoire. En cas de mémoire disponible insuffisante, vous libérez le bloc
mémoire.
Au moment de récupérer l'adresse physique de la page précédemment allouée,
vous écrivez ceci :
mmctxt->paddr_PD = sos_paging_get_paddr(mmctxt->vaddr_PD);
if (mmctxt->paddr_PD == 0)
{
sos_kmem_cache_free((sos_vaddr_t) mmctxt);
return NULL;
}
Ce qui me dérange c'est que la page allouée n'est pas libérée et en plus, si
cette page n'est pas mappée, la fonction sos_paging_get_paddr() retourne 0
lorsque la page vient juste d'être allouée. J'aurais plutôt pensé que vous
auriez inséré une assertion à cette endroit.
Suis-je en train de me tromper ?
Dans la fonction sos_mm_context_duplicate() :
Le paramètre d'entré n'est pas vérifié.
Dans la fonction sos_mm_context_unref() :
Le paramètre d'entré n'est pas vérifié.
Dans la fonction sos_mm_context_ref() :
Le paramètre d'entré n'est pas vérifié.
C'est tout.
Cyril.
http://perso.wanadoo.fr/koalys
Plus d'informations sur la liste de diffusion Sos