next up previous
Next: Literatura Up: Model pamięci niezależny od Previous: Funkcje wywoływane podczas przydzielania

Opisy funkcji

pte_t *pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address) sprawdza, czy pole wskazywane przez pmd zawiera opis istniejącej tablicy stron.
Jeśli nie, próbuje pobrać potrzebny obszar z listy pte_quicklist.
Jeśli lista jest pusta, zwalnia blokadę mm-$>$page_table_lock (założoną przed wejściem do procedury, by inny proces nie mógł modyfikować tablic stron wraz z nami) i żąda przydzielenia nowego obszaru, gdy go dostanie spowrotem zakłada blokadę mm-$>$page_table_lock i sprawdza, czy ktoś inny w międzyczasie nie zaallokował pmd.
Jeśli tak to zwalniamy stroną, którą pobraliśmy.
Jeśli nie to wypełnia pmd opisem zaallokowanej tablicy stron.
W każdym z przypadków zwraca adres pola z zallokowanej (lub nie) tablicy stron, które bierze udział w tłumaczeniu adresu liniowego ze zmiennej address.
pmd_alloc analogicznie.
pgd_alloc podobnie, lecz prościej: nie trzeba sprawdzać czy pqd istnieje, ani dbać o to, czy inny proces nie chce go zaallokować.

xxx_none(xxx_t xxx), xxx_present(xxx_t xxx), xxx_bad(xxx_t xxx), xxx_clear(xxx_t xxx) sprawdzają obecność, poprawność i czyszczą xxx za pomocą bitowych operacji na xxx
Nie ma funkcji pte_bad(), zamiast niej istnieje kilka funkcji pozwalających sprawdzać wartość i modyfikować bity ochrony pozycji tablicy pte.

pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long address) pobiera stronę z listy pte_quicklist jeśli lista jest pusta zwraca 0, wpp. adres liniowy strony.
Analogicznie pmd_alloc_one_fast.
pgd_t *get_pgd_fast(void) jak wyżej, z tym, że kiedy lista jest pusta allokuje nową stronę za pomocą get_pgd_slow

pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address) przydziela nowy obsza pamići za pomocą __get_free_page,a następnie go czyści.
Analogicznie pmd_alloc_one.
pgd_t *get_pgd_slow(void) jak wyżej, z tym że w zależności od architektury wykonuje również inne czynności.

void pmd_populate(mm,pmd_t *pmd,pte_t *pte) tworzy pole pośredniego katalogu stron opisujące tablicę stron znajdującą się pod adresem liniowym pte i umieszcza w pośrednim katalogu stron, w polu wskazywanym przez pmd.
pgd_populate analogicznie.

set_xxx(xxx_t *xxxptr, xxx_t xxxval) (lub xxx_set zależnie od architektury) umieszcza xxxval w polu wskazywanym przez xxxptr.

xxx_t *xxx_offset(dir, void *address) zwraca adres pola w tablicy xxx wskazywanej przez dir, gdzie dir jest wskaźnikiem na strukturę wyższego rzędu, które bierze udział w tłumaczeniu adresu liniowego address. Konkretna postać dir zależy od xxx.

xxx_page(xxx_t xxx) zwraca adres liniowy strony, na której znajduje się tablica wskazywana przez xxx, gdy xxx jest postaci pgd lub pmd.
mem_map_t *pte_page(pte_t pte) zwraca adres pola w tablicy ramek opisującego ramkę odpowiadającą stronie wzkazuwanej przez pte.
Funkcje zwracające adres liniowy tablic stron korzystają z faktu, że tablica stron stanowi spójny blok pamięci fizycznej, którego adres fizyczny jest w tablicy nadrzędnego poziomu, a który można łatwo przetłumaczyć na adres liniowy za pomocą makra __va()

W wersji dla Intela zaallokowanie tablicy pgd oznacza zaallokowanie wszystkich podlegających mu tablic pmd, analogicznie usuwanie. Próba wywołania odpowiedniej funkcji dotyczącej pmd zwraca błąd.

Zwalnianie pamięci jest prostsze:
void xxx_free(xxx_t *xxx) uruchamia funkcję xxx_free_fast(xxx).
void xxx_free_fast(xxx_t *xxx) dołącza pamięć zajmowaną przez xxx do xxx_quicklist.
void xxx_free_slow(xxx_t *xxx) zwalnia pamięć zajmowaną przez xxx za pomocą np. free_page.


next up previous
Next: Literatura Up: Model pamięci niezależny od Previous: Funkcje wywoływane podczas przydzielania
Wojciech Jaworski 2001-12-16