[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