Incrementando o reduciendo el espacio de direcciones del kernel

Por defecto, el espacio de direcciones del kernel es de 256MB en FreeBSD 3.x y 1GB en FreeBSD 4.x. Si gestionas un servidor de red muy cargado (por ejemplo, servidores FTP o HTTP con mucho tráfico), es posible que notes que 256MB no es suficiente.

Así que… como incremento el espacio de direcciones?. Hay dos aspectos a tener en cuenta. Primero, necesitas indicarle al kernel que reserve una mayor parte del espacio de direcciones para él mismo. Segundo, ya que el kernel se carga al inicio del espacio de direcciones, necesitas disminuir la dirección de carga.

El primer aspecto lo solucionamos incrementando el valor de NKPDE en src/sys/i386/include/pmap.h. Esta es una entrada de ejemplo para 1GB de espacio de direcciones:

 

#ifndef NKPDE
#ifdef SMP
#define NKPDE                   254     /* addressable number of page tables/pde’s */
#else
#define NKPDE                   255     /* addressable number of page tables/pde’s */
#endif  /* SMP */
#endif

Para encontrar el valor correcto de NKPDE, divide el espacio de direcciones deseado (en megabytes) por cuatro, después resta uno por UP y dos por SMP.

Para solucionar el segundo aspecto, necesitas calcular la dirección correcta de carga: simplemente resta el tamaño del espacio de direcciones (en bytes) de 0x100100000; el resultado es 0xc0100000 para 1GB de espacio de direcciones. Ajusta LOAD_ADDRESS en src/sys/i386/conf/Makefile.i386 a ese valor; a continuación pon el contador al inicio de la sección listado en src/sys/i386/conf/kernel.script al mismo valor, como sigue:

 

OUTPUT_FORMAT(“elf32-i386”, “elf32-i386”, “elf32-i386”)
OUTPUT_ARCH(i386)
ENTRY(btext)
SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/obj/elf/home/src/tmp/usr/i386-unknown-FreeBSDelf/lib);
SECTIONS
{
/* Read-only sections, merged into text segment: */
. = 0xc0100000 + SIZEOF_HEADERS;
.interp     : { *(.interp)    }

Reconfigura y compila el kernel. Probablemente tengas problemas con top(1), ps(1) y programas así haciendo un make world deberín solucionarse esos problemas (o una recompilación manual de libkvm, ps y top después de copiar el pmap.h parcheado a /usr/include/vm/.

NOTA: el tamaño del espacio de direcciones debe ser un múltiplo de cuatro megabytes.

About the author