jueves, febrero 03, 2005

libPFTrace: Páginas que se protegen al iniciar el proceso

Situción: Al cargar el programa en memoria libpftrace protege todas las páginas exceptuando las necesarias para que no se produzcan excepciones que no podamos controlar.

Problema: Determinar el conjunto mínimo de páginas que hemos de protejer para que en cualquier sistema funcione libpftrace.

Notas:
- En algún sistema funciona tal qual en otros hay que añadir páginas a la restricción para que funcione.
- La dirección de la pila es diferente en función del sistema.

Ideas:
- Comprobar donde se encuentran las variables que se utilizan.

Código:

if (
!(((void *)&pftrace_catch_acces_violation_trace2 > (void *)add1) && ((void *)add2 > (void *)&pftrace_catch_acces_violation_trace2))
&& !(((void *)pftrace_page_range > (void *)add1) && ((void *)add2 > (void *)pftrace_page_range))
&& !(((void *)&pftrace_page_range > (void *)add1) && ((void *)add2 > (void *)&pftrace_page_range))
&& !(((void *)&pftrace_page_range_len > (void *)add1) && ((void *)add2 > (void *)&pftrace_page_range_len))
&& !(((void *)&mprotect > (void *)add1) && ((void *)add2 > (void *)&mprotect))
&& !((sscanf(pftrace_page_range[iAnt].name, "/%s/libPFC.so.1.0.1",name) ==1) && (pftrace_page_range[i].prots == (PROT_READ | PROT_WRITE)))
&& !((sscanf(name, "/lib/libc-%s",name) ==1) && (pftrace_page_range[i].prots == (PROT_READ | PROT_WRITE)))
&& !((sscanf(pftrace_page_range[iAnt].name, "/lib/libc-%s",name) ==1) && (pftrace_page_range[i].prots == (PROT_READ | PROT_WRITE)))
&& !(add1 > 0xbfff0000) // pila
&& !(sscanf(name, "/lib/libpthread-%s",name) == 1)
&& ((void *)add1 != pftrace_ini_shmem_global) //No proteigim la shared memory.
// TEMPORALMENT no protegim printf!!! (debug)
&& !(((void *)&printf > (void *)add1) && ((void *)add2 > (void *)&printf))
)
{
mprotect((void *)add1, add2-add1, PROT_NONE);
pftrace_page_range[i].protected = 1;
escribir_traza()
}