Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Nodos (Administracion de la Memoria Virtual en linux)

Aqui les dejo otra explicacion mas de la administracion de la memoria virtual en linux…
Antes deberas leer esto si no sabes que ondas con lo que pongo aqui

Cada no es representado por pg_data_t, el cual es un tipo definido para la estructura pglist_data. Cuando se asigna una pagina, Linux usa una politica de asignar memoria del nodo mas cercano a la CPU. A razon de que el proceso corre sobre la misma CPU,
es mas razonable que la memoria del actual nodo(o banco de memoria) sea la que se use. La estructura es declara como sigue en :

 typedef struct pglist_data {
       zone_t node_zones[MAX_NR_ZONES];
       zonelist_t node_zonelists[GFP_ZONEMASK+1];
       int nr_zones;
       struct page *node_mem_map;
       unsigned long *valid_addr_bitmap;
       struct bootmem_data *bdata;
       unsigned long node_start_paddr;
       unsigned long node_start_mapnr;
      unsigned long node_size;
     int node_id;
     struct pglist_data *node_next;
 } pg_data_t;

Bien, ahora describiremos cada uno de los nodos de esta estructura:

node_zones : La zonas para este nodo son ZONE HIGHMEM, ZONE NORMAL, ZONE DMA.

node_zonelists : Este es el orden de las zonas asignadas proveniente de build_zonelists() en mm/page alloc.c , este orden se establece cuando se llamo a free_area_init_core(). Una asignacion fallida en ZONE HIGHMEM puede mandar de regreso a ZONE NORMAL o de regreso a ZONE DMA.

nr_zones : Este es el numero de zonas sobre este nodo, entre uno y tres. No todos los nodos llegaran a tener 3.

node_mem_map Esta es la primera pagina del arreglo de structuras page que representan cada cuadro fisico en el nodo. Es sera acomodado en algun lugar dentro del global mem_map_array.

valid_addr_bitmap : Este es un mapa de bits que describe huecos en el nodo de memoria. En realidad este solo es usado para SPARC.

node_size : Numero total de paginas en esta zona.

node_id : Esta es la ID del nodo (NID).

node_next : Puntero a el siguiente nodo sobre una lista terminada en NULL.

bdata : Este es solo del interes del asignado de memoria de arranque ( boot memory ), hablaremos de el despues.

node_start_paddr : Esta es la principal direccion fisica del nodo.

node_start_mapnr : Este otorga el offset de la pagina dentro del mapa global de memoria (mem_map). Este es calculado en free_area_init_core() , el cual calcula el numero de paginas entre mem_ map y el mem_map local para este nodo llamado lmem_map.

Todos los nodos en el sistema son mantenidos sobre una lista llamada pgdat_list. Los nodos son albergados sobre una lista, como estos van siendo inicializados por la funcion init_bootmem_core().

En los nucleos de linux mas recientes a 2.2, un macro for_each_pgdat(), el cual es trivialmente definido como un loop for, es puesto para mejorar la legilbilidad del codigo.

Comenta