next up previous contents
Next: Algorytm ``bliźniaków'' Up: Obsługa pamięci dynamicznej na Previous: Wprowadzenie   Spis rzeczy

Obsługa ramek

System operacyjny musi kontrolować stan poszczególnych ramek w systemie. Służy do tego tablica mem_map zawierająca po jednym wpisie typu page dla każdej ramki fizycznej.

Struktura opisu ramki:

struct page {              // struktura opisująca jedną ramkę w systemie
   struct list_head       list;
   struct address_space*  mapping;
   unsigned long          index;            
   struct page*           next_hash;         
   atomic_t               count;    // 0 - ramka wolna, >0 - ilość odwołań       
   unsigned long          flags;    // flagi opisujące ramkę
   struct list_head       lru;
   unsigned long          age;       
   wait_queue_head_t      wait;     // kolejka czekających na I/O na ramce
   struct page**          pprev_hash;     
   struct buffer_head*    buffers;
   void*                  virtual;
   struct zone_struct*    zone;     // strefa, z której pochodzi ramka
} mem_map_t;

mem_map_t* mem_map;       // alokowana pamięć na tyle struktur typu
                          // mem_map_t ile ramek w systemie.

Ważniejsze flagi (pole flags):

PG_reserved
- Strona nie może zostać poddana wymianie na dysk (dotyczy stron jądra specjalnego przeznaczenia)
PG_locked
- Ustawiane na czas operacji I/O na stronie (oznacza w szczególności, że nie może ona zostać wymieniona na dysk)
PG_highmem
- Ramka wysokiej pamięci fizycznej nie odwzorowywana na stałe przez jądro.

Tablica mem_map inicjowana jest przy starcie systemu przez funkcję free_area_init.

Użyteczne makro MAP_NR(addr) wylicza numer ramki (indeks w tablicy mem_map) o adresie addr.



Adam Koprowski 2001-12-18