|
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".
![]() | 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
- B_ERROR. Dany adres nie znajduje się wewnątrz obszaru.
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).
- clone_name jest nazwą, którą chcesz przypisać doobszaru-kolonu. Nazwy obszarów są, w większości, ciągami znaków o długości B_OS_NAME_LENGTH.
- clone_addr wskazuje na wartość, która dostarcza adres od którego obszar ma się rozpoczynać ; wskazywana wartość musi być wielokrotnością B_PAGE_SIZE (4096). Ta funkcja ustawia wskazywaną przez clone_addr na rzeczywisty adres początkowy obszaru - może być on różny od tego, którego ządałeś. Stałość argumentu *clone_addr zależy od wartości clone_addr_spec, jak wyjaśniono dalej.
- clone_addr_spec jest jedną z czterech stałych, które opisują jak clone_addr ma zostać zinterpretowany. Pierwsze trzy stałe, B_EXACT_ADDRESS, B_BASE_ADDRESS i B_ANY_ADDRESS, mają takie znaczenie jak wyjaśniono w opisie funkcji create_area().
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.
- clone_protection jest jedną lub obydwoma B_READ_AREA i B_WRITE_AREA. Tutaj mają one takie samo znaczenie jak w funkcji create_area(); keep in mind, jak opisano tutaj, że klonowany obszar może mieć ochronę, która jest różna od tej z jego źródła.
- source_area jest identyfikatorem area_id obszaru, który pragniesz sklować. Zwykle dostarczasz tę wartość do funkcji find_area() przez podanie nazwy obszaru.
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
- B_BAD_VALUE. Zła wartość argumentu; podałeś nierozpoznana stałą dla addr_spec lub lock, wartość addr nie jest wielokrotnością B_PAGE_SIZE, ustawiłeś addr_spec na B_EXACT_ADDRESS lub B_CLONE_ADDRESS ale żądany adres nie może byc spełniony (uzyskany) lub source_area nie identyfikuje istniejącego obszaru.
- B_NO_MEMORY. Nie ma więcej pamieci do przydzielenia struktur systemowych, które wspierają ten (nieoczekiwany) obszar.
- B_ERROR. Jakiś inny błąd systemowy wstrzymał rozpoczęcie tworzenia obszaru.
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.
- name jest nazwa, którą pragniesz przypisac do tego obszaru. Nie potrzeba aby był on unikalny. Nazwy obszaru są, w większości, ciągami znaków o długości B_OS_NAME_LENGTH (32).
- addr wskazuje na adres od którego chcesz rozpocząć obszar. Wartość *addr musi oznaczać granicę strony; innymi słowy musi być ona być całkowitą wielokrotnością B_PAGE_SIZE (4096). Zauważ, że jest to wskaźnik do wskaźnika: *addr - nie addr - powinien być ustawiony na żądany adres; przekazujesz wtedy ten adres z addr jako argument, jak pokazano poniżej:
/* 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.
- addr_spec jest stałą, która mówi funkcji jak powinna być zastosowana wartość *addr. Są trzy użyteczne stałe do określania adresów i jedna, która nie ma tutaj zastosowania:
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().
- size jest rozmiarem obszaru w bajtach. Rozmiar musi być całkowitą wielokrotnością B_PAGE_SIZE (4096). Górne ograniczenie argumentu size zależy od dostępnej przestrzeni wymiany (lub RAM, jeśli obszar ma zostać zablokowany).
- lock jak pamięć fizyczna powinna być potraktowana co co wymiany. describes how the physical memory should be treated with regard to swapping. Są cztery stałe blokowania:
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.
- protection jest maską, która opisuje czy pamięć może być zapisana i odczytana. Maskę tworzysz przez dodanie stałych B_READ_AREA (obszar może być czytany) i B_WRITE_AREA (może on być zapisany). Ochrona, którą opisujesz ma zastosowanie tylko do tego obszaru. Jeżeli twój obszar jest sklonowany, klon może wyszczególniać różną ochronę.
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
- B_BAD_VALUE. Zła wartość argumentu. Przekazałeś nierozpoznaną stałą do addr_spec lub lock, wartość addr lub size nie jest wielokrotością B_PAGE_SIZE, lub ustawiłeś addr_spec na B_EXACT_ADDRESS ale żądany adres nie mógł być spełniony.
- B_NO_MEMORY. Nie ma dosyć pamięć by przydzielić struktury systemowe, które wspierają ten obszar (nierealny), nie ma dosyć pamięci fizycznej by wesprzeć zablokowany obszar, albo nie ma dość przestrzeni wymiany by przydzielić pamięć wirtualną (innymi słowy, size jest za duży.)
- B_ERROR. Jakieś inne błędy systemu przeszkodziły w rozpoczęciu tworzenia obszaru.
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ł:
- Jeżeli znajdujesz obszar, który utworzyła albo sklonowała twoja własna aplikacja, możesz użyć bezpośrednio zwróconego ID.
- Jeśli obszar był utworzony albo sklowany przez jakąś inną aplikację, powinieneś natychmiast sklonować obszar (jeżeli nie robisz czegoś naprawdę nieszkodliwego, takiego jak proste badanie struktury informacyjnej obszaru).
ZWRACANE KODY
- B_NAME_NOT_FOUND. Argument nie identyfikuje istniejącego obszaru.
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ą:
- area jest area_id któy określa obszar.
- name jest nazwą, która była przypisana do obszaru gdy był on tworzony lub klonowany.
- size jest (wirtualnym) rozmiarem obszaru podanym w bajtach.
- lock jest stałą, która reprezentuje schemat blokowania obszaru. Będzie ona jedna z B_FULL_LOCK, B_CONTIGUOUS, B_LAZY_LOCK, B_NO_LOCK, lub B_LOMEM.
- protection określa czy pamięć obszaru może być czytana lub zapisywana. Jest to połączenie B_READ_AREA i B_WRITE_AREA.
- team jest team_id zespołu, który tworzył lub klonował ten obszar.
- address jest wskaźnikiem do adresu początkowego obszaru. Miej na uwadze, że ten adres jest znaczący tylko dla zespołu, który utworzył (albo sklonował) ten obszar.
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:
- ram_size podaje wielkość obszaru, w bajtach, który jeest aktualnie wymieniony (na dysk do pliku wymiany).
- copy_count jest licznikiem "kopii do zapisu" który może być zignorowany - nie stosuje się to do obszarów, które tworzysz. System może tworzyć obszary kopii do zapisu (robi tak, na przykład wtedy gdy ładuje sekcję danych pliku wykonywalnego), ale Ty nie możesz.
- in_count jest licznikiem sumarycznej liczby krotności wymian jakichkolwiek stron w obszarze, które były wymieniane z dysku.
- out_count jest licznikiem sumarycznej liczby krotności wymian jakichkolwiek stron w obszarze, które były wymieniane na dysk.
ZWRACANE KODY
- B_OK. Obszar został znaleziony; info zawiera prawidłową informację.
- B_BAD_VALUE. area nie identyfikuje istniejącego obszaru, team nie identyfikuje istniejącego zespołu lub nie ma więcej obszarów do odwiedzenia.
![]() | 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
- B_OK. Zmieniono rozmiar obszaru z sukcesem.
- B_BAD_VALUE. area nie oznacza prawidłowego obszaru lub new_size nie jest wielokrotnością B_PAGE_SIZE.
- B_NO_MEMORY. Nie ma więcej pamięci do wsparcia nowej porcji obszaru. To powinno się zdarzyć tylko jeżeli powiększasz wielkość obszaru.
- B_ERROR. Jakieś inne błędy systemu przeszkodziły w rozpoczęciu tworzenia obszaru.
![]() | 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
- B_OK. Ochrona była zmieniona.
- B_BAD_VALUE. area nie oznacza prawidłowego obszaru.
|
Be Book,
...w ślicznym HTML...
dla BeOS wydanie 5
Copyright © 2000 Be, Inc. Wszelkie prawa zastrzeżone.