Be Book Kernel Kit Kernel Kit Indeks

Obszary

Zadeklarowane w:  be/kernel/OS.h
Biblioteka: libroot.so
Streszczenie:  więcej...

Obszar jest porcją pamięci wirtualnej, która może być współdzielona pomiędzy wątki (być może w różnych zespołach). Jeśli Twoja aplikacja potrzebuje przydzielenia dużej porcji pamięci lub chce współdzielić wiele danych z inną aplikacją to powinieneś wziąć pod uwagę użycie obszaru.

Aby dowiedzieć sięwięcej o pojęciach obszaru, zobasz do "Pojęcia obszaru ".

Aby zobaczyć przykłady tworzenia i współdzielenia obszarów, zajrzyj do "Przykłady obszaru".


Funkcje Obszaru


area_for()

area_id area_for(void *addr)

Zwraca obszar, który zawiera dany adres (wewnątrz przestrzeni adresowej Twojego własnego zespołu). Argument nie musi być adresem początkowym obszaru, ani nie musi rozpoczynać się na granicy strony: jeśli adres jest położony gdziekolwiek wewnątrz jednego z obszarów Twojej aplikacji, jest zwracany ID (identyfikator) tego obszaru.

Skoro adres jest tak obrany aby był w lokalnej przestrzeni adresowej, obszar który jest zwracany będzie również lokalny - został on utworzony lub sklonowany przez Twoją aplikację.

ZWRACANE KODY

Popatrz również do: find_area()


clone_area()

area_id clone_area(const char *clone_name,
      void **clone_addr,
      uint32 clone_addr_spec,
      uint32 clone_protection,
      area_id source_area)

Tworzy nowy obszar (obszar clone - klon) który mapuje do (zaznacza na) tej samej pamięci fizycznej jako obszar istniejący (obszar source - źródłowy).

Czwarta stała, B_CLONE_ADDRESS, określa, który adres koloowanego obszaru powinien być taki sam jak adres obszaru źródłowego. Klonowanie adresu jest dogodne, jeśli masz dwie (albo więcej) aplikacji, które chcą przekazać wskaźniki wskazówki jedna do drugiej - przez używanie sklonowanych adresów, aplikacje nie będą musiały przesuwać wskaźników, które odebrały. Dla obydwu specyfikacji B_ANY_ADDRESS i B_CLONE_ADDRESS, wartości, które są wskazywane przez argument clone_addr są ignorowane.

klonowany obszar dziedziczy schemat blokowania obszaru źródłowego.

Zwykle obszar źródła i obszar klonu są w dwóch różnych aplikacjach. Możliwe jest sklonowanie obszar ze źródła, które jest w tej samej aplikacji, ale nie jest to znaczący powód by tak zrobić chyba, że chcesz aby obszary miały różne ochrony.

Jeśli klonowanie wykonane przez funkcję clone_area() jest pomyślne, jest zwracany identyfikator klonu area_id. W przeciwnym wypadku, zwraca ona opisowy kod błędu, przedstawiony poniżej.

ZWRACANE KODY

Popatrz również do: create_area()


create_area()

area_id create_area(const char *name,
      void **addr,
      uint32 addr_spec,
      uint32 size,
      uint32 lock,
      uint32 protection)

Tworzy nowy obszar i zwraca jego identyfikator area_id.

/* Ustaw adres na granicy strony. */
char *addr = (char *)(B_PAGE_SIZE * 100);

/* Przekaż adres z addr jako drugi argument. */
create_area( "my area", &addr, ...);

Ta funkcja ustawia wartość *addr na aktualny początkowy adres obszaru - może on być różny od żądanego przez Ciebie. Stałość *addr zależy od wartości addr_spec, jak pokazano dalej.

Stała Znaczenie
B_EXACT_ADDRESS Chcesz aby wartość *addr była brana dosłownie i dokładnie. Jeżeli obszar nie może być przydzielony w tamtej lokalizacji, funkcja zawodzi.
B_BASE_ADDRESS Obszar może rozpoczynać się w lokalizacji równej lub większej niż *addr.
B_ANY_ADDRESS Adres początkowy jest określony przez system. W tym przypadku, wartość która jest wskazywana przez addr jest ignorowana (przejście do wnętrza funkcji).
B_ANY_KERNEL_ADDRESS Adres początkowy jest określony przez system a nowy obszar będzie należeć do zespołu jądra; nie będzie on usunięty kiedy aplikacja zakończy działanie. W tym przypadku, wartość wskazywana przez addr jest ignorowana (przechodzi do wnętrza funkcji).
B_CLONE_ADDRESS Jest ona znacząca tylko dla funkcji clone_area().

Stała Znaczenie
B_FULL_LOCK Obszar pamięci jest zablokowany w RAM gdy obszar jest tworzony i nie będzie wymieniany na dysk.
B_CONTIGUOUS Nie tylko jest obszarem zablokowanym w RAM, jest on również zagwarantowane, że będzie przyległy (ciągły). Jest to szczególnie - a być może wyłącznie - użyteczne dla projektantów pewnych typów sterowników urządzeń.
B_LAZY_LOCK Pozwala pojedynczym stronom pamięci aby były przeniesione do RAM w pierwotnej kolejności a następnie blokuje je.
B_NO_LOCK Strony nigdy nie są blokowane, są opne wymieniane tam i z powrotem jeśli są potrzebne.
B_LOMEM Jest to specjalna stała, która jest używana dla obszarów, które potrzebują być zablokowane, przyległe i które leżą wewnątrz pierwszych 16MB pamięci fizycznej. Ludzie, którzy potrzebują tej stałej o co chodzi.

Jeśli funkcja create_area() zakończyła się sukcesem, zwracany jest nowa liczba area_id . Jeśli nie zakończyłą się sukcesem, jest zwracana następujących stałych błędu.

ZWRACANE KODY

Popatrz również do: clone_area()


delete_area()

status_t delete_area(area_id area)

Usuwa wyznaczony obszar. Jeżeli nikt inny nie mapuje obszaru do pamięci fizycznej, którą ten obszar reprezentuje, pamięć jest zwolniona. Po usunięciu, wartość obszaru jak również identyfikatora obszaru jest nieważna.

Aktualnie, każdy może usunąć jakikolwiek obszar - takie działanienie nie jest odrzucane jeżeli, na przykład, argument area_id był utworzony przez inną aplikację. Ta wolność będzie zniesiona w późniejszej wersji. Na razie puki co, spróbuj uniknąć usuwania obszarów innej aplikacji.

ZWRACANE KODY


find_area()

area_id find_area(const char *name)

Zwraca obszar, który ma nazwę, która dopasowuje argument. Nazwy obszaru nie muszą być unikalna - kolejne wywołanie tej funkcji z tą samą wartością argumentu mogą nie zwrócić tego samego area_id.

To co zrobisz z obszarem, który znalazłeś zależy od tego skąd on pochodził:

ZWRACANE KODY

Popatrz również do: area_for()


get_area_info(), get_next_area_info(), area_info

status_t get_area_info(area_id area, area_info *info)
status_t get_next_area_info(team_id team, int32 *cookie, area_info *info)
struct {} area_info

Kopiuje informację o konkretnym obszarze do struktury area_info wyznaczonej przez info. Pierwsza wersja tej funkcji wyznacza obszar bezpośrednio, przez area_id.

Wersja get_next_area_info() pozwala Ci kroczyć poprzez listę obszarów zespołu przez wywoływanie funkcji. Argument team identyfikuje zespół który chcesz zobaczyć; wartość team równa 0 oznacza wywoływanego wątku. Argument cookie jest znacznikiem miejsca; ustawiasz go na 0 w Twoim pierwszym wywołaniu i pozwalasz funkcji zrobić resztę. Ta funkcja zwraca B_BAD_VALUE gdy nie ma już wiećej obszaró do odwiedzenia:

/* Podaj area_info dla każdego obszaru w tym zespole. */
area_info info;
int32 cookie = 0;

while (get_next_area_info(0, &cookie, &info) == B_OK)
   ...

Strukturą area_info jest:

typedef struct area_info {
         area_id area;
         char name[B_OS_NAME_LENGTH];
         size_t size;
         uint32 lock;
         uint32 protection;
         team_id team;
         size_t ram_size;
         uint32 copy_count;
         uint32 in_count;
         uint32 out_count;
         void *address;
      } area_info;

Polami są:

Cztery końcowe pola udzielają informacji o obszarze, który jest użyteczny w diagnozowaniu użytego systemu. Te pola są szczególnie wartościowe jeżeli wyszukujesz przecieków pamięci:

ZWRACANE KODY


resize_area()

status_t resize_area(area_id area, size_t new_size)

Ustawia rozmiar wyznaczonego obszaru na new_size, mierzonego w bajtach. Argument new_size musi być wielokrotnością B_PAGE_SIZE (4096).

Modyfikacje rozmiaru dotyczą końca istniejącego przydziału pamięci obszaru: Jeżeli powiększasz wielkość obszaru, nowa pamięć jest dodawana do końca obszaru; jeżeli zmiejszasz obszar, strony końcowe są opuszczane i zwalniane. W żadnym przypadku nie nie są czynione zmiany adresu początkowego obszaru, ani nie są modyfikowane istniejące dane (z wyjątkiem, oczywiście, dla danych , które są tracone z powodu zmniejszania).

Zmienienie rozmiaru dotyczy wszystkich obszarów, które odnoszą się do tych obszarów pamięci fizycznej. Na przykład, jeżeli B jest klonem A, a Ty zmieniasz wielkość A, B będzie mieć automatycznie zmieniony rozmiar (w miarę możności)..

ZWRACANE KODY


set_area_protection()

status_t set_area_protection(area_id area, uint32 new_protection)

Ustanawia danemu obszarowi ochronę przed czytaniem i zapisem. Argument new_protection jest maską, która określa jedną albo obie wartości B_READ_AREA i B_WRITE_AREA. Poprzedni oznaczał, że obszar może być czytany; kolejny, że można do niego zapisywać. Ochrona obszaru stosuje się tylko do uzyskania dostępu do warstwy pamięci określonej tak przez obszar. Inne klony obszaru, które odnoszą się do tej samej pamięci mogą mieć inne ochrony.

ZWRACANE KODY


Be Book Kernel Kit Kernel Kit Indeks

Be Book,
...w ślicznym HTML...
dla BeOS wydanie 5

Copyright © 2000 Be, Inc. Wszelkie prawa zastrzeżone.