[OSDev] Memory manager

0

Witam!
W swoim OSie doszedłem do memory managera. Postanowiłem zrobić go na zasadzie tablicy bitowej. Rezerwowanie całych ramek mam zrobione. Ale mój problem zaczyna się kiedy trzeba zarezerwować tylko parę bajtów pamięci. Obecnie MM rezerwuje całą ramkę, ale to straszne marnowanie pamięci. Sam nie mogę wymyślić nic działającego. Jak można to rozwiązać? Jak jest to zrobione w innych OSach? Bo Google nie chce mi nic powiedzieć.
Z góry dzięki za odpowiedź.

0
lukasz1235 napisał(a)

Jak jest to zrobione w innych OSach? Bo Google nie chce mi nic powiedzieć.

Acha, fraza "memory managment"+ [kernel, linux, bsd, minix etc.] nic nie daje...
http://tldp.org/LDP/tlk/mm/memory.html
http://tldp.org/HOWTO/KernelAnalysis-HOWTO-7.html

0

Może jestem ślepy, ale nie znalazłem tam nic interesującego.

0

Jakie pytanie, taka odpowiedź.

Wytłumacz mi jak przedszkolakowi, gdzie jesteś i z czym masz problem.
Jestem w osdevie greenhornem, ale przejrzałem pobieżnie materiały:
http://wiki.osdev.org/Memory_Allocation
http://wiki.osdev.org/Writing_a_memory_manager
http://www.osdever.net/tutorials/memory1.php?the_id=44
http://www.osdever.net/tutorials/memory2.php?the_id=45
i nie natrafiłem na słowo ramka(frame) z wyjatkiem page frame. No chyba że używasz 'ramka' jako 'block'.

Zgaduję że chcesz zrobić malloca/allocatora.

Dodatkowe materiały jakie znalazłem, ale nie przeczytałem:
http://www.cs.ucsb.edu/~grze/papers/Keyword/MEMORY-MANAGEMENT.html
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=tree;f=mm;h=fb54c3d566aa8b5f1e7fb76e9ba8b6b3a734c9ff;hb=HEAD

0
lukasz1235 napisał(a)

Rezerwowanie całych ramek mam zrobione. Ale mój problem zaczyna się kiedy trzeba zarezerwować tylko parę bajtów pamięci. Obecnie MM rezerwuje całą ramkę, ale to straszne marnowanie pamięci.
Czyli pewną część MM mam, ale chodzi mi o rezerwowanie obszarów mniejszych niż rozmiar ramki (czyli 4096 bajtów). Czyli np. malloc(sizeof(int)) rezerwuje 4096 bajtów zamiast czterech. Już rozumiesz? Teraz chodzi mi o to żeby rezerwował tylko te cztery bajty. Oprócz zmniejszenia rozmiaru ramki do paru bajtów (ale przez to ogromnie wzrośnie mi rozmiar tablicy bitowej) nic działającego nie wymyśliłem.

0

No to potraktuj tą ramkę jako memory pool dla konkretnej applikacji. Tzn. program allokuje sizeof(int) bajtów dostaje te 4 kB, ale jak ponownie alokuje sizeof(long) to nie dostaje kolejnych 4 kB, tylko w tych już zaalokowanych.

Co powinieneś uwzględnić:

  • id procesu/programu, tak aby memory pool był własnością tylko jednej aplikacji.
  • kolejna tablica bitowa odpowiednia do zaznaczenia które bloki memory poola zostały zajęte
    Powyższe informacje włóz w ramkę, zmniejszy się jej rozmiar uzytkowy, ale zmiejszyszy się też problem fragmentacji.
0

Przecież system nie musi zarządzać alokacją każdego małego inta. Od tego jest runtime aplikacji, przydzielający pamięć w ramach ramki nadanej przez system. OS wystarczy że będzie przydzielał w ramkach po 4096 bajtów powiedzmy.

0

Polecam implementację malloc:
http://g.oswego.edu/pub/misc/malloc.c

Poza tym w systemie mamy manager pamięci fizycznej, wirtualnej no i dynamiczną pamięć kernela (sterta?).

Zastanów się co chcesz zaimplementować.

0

Chyba rozwiązanie burego pajaca jest najlepsze.
Dzięki wszystkim za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1