The Kernel Kit Table of Contents | The Kernel Kit Index |
Declared in: be/kernel/OS.h
Library: libroot.so
An area is a chunk of virtual memory that can be shared between threads (possibly in different teams). If your application needs to allocate large chunks of memory, or wants to share lots of data with another application, you should consider using an area.
For more on area concepts, see "Areas Concepts".
For examples of creating and sharing areas, see "Area Examples".
|
Returns the area that contains the given address (within your own team's address space). The argument needn't be the starting address of an area, nor must it start on a page boundary: If the address lies anywhere within one of your application's areas, the ID of that area is returned.
Since the address is taken to be in the local address space, the area that's returned will also be local—it will have been created or cloned by your application.
RETURN CODES
See also: find_area()
|
Creates a new area (the clone area) that maps to the same physical memory as an existing area (the source area).
The fourth constant, B_CLONE_ADDRESS, specifies that the address of the cloned area should be the same as the address of the source area. Cloning the address is convenient if you have two (or more) applications that want to pass pointers to each other—by using cloned addresses, the applications won't have to offset the pointers that they receive. For both the B_ANY_ADDRESS and B_CLONE_ADDRESS specifications, the value that's pointed to by the clone_addr argument is ignored.
The cloned area inherits the source area's locking scheme.
Usually, the source area and clone area are in two different applications. It's possible to clone an area from a source that's in the same application, but there's not much reason to do so unless you want the areas to have different protections.
If clone_area() clone is successful, the clone's area_id is returned. Otherwise, it returns a descriptive error code, listed below.
RETURN CODES
See also: create_area()
|
Creates a new area and returns its area_id.
/* Set the address to a page boundary. */ char *addr = (char *)(B_PAGE_SIZE * 100); /* Pass the address of addr as the second argument. */ create_area( "my area", &addr, ...);
The function sets the value of *addr to the area's actual starting address—it may be different from the one you requested. The constancy of *addr depends on the value of addr_spec, as explained next.
Constant | Meaning |
---|---|
B_EXACT_ADDRESS | You want the value of *addr to be taken literally and strictly. If the area can't be allocated at that location, the function fails. |
B_BASE_ADDRESS | The area can start at a location equal to or greater than *addr. |
B_ANY_ADDRESS | The starting address is determined by the system. In this case, the value that's pointed to by addr is ignored (going into the function). |
B_ANY_KERNEL_ADDRESS | The starting address is determined by the system, and the new area will belong to the kernel's team; it won't be deleted when the application quits. In this case, the value that's pointed to by addr is ignored (going into the function). |
B_CLONE_ADDRESS | This is only meaningful to the clone_area() function. |
Constant | Meaning |
---|---|
B_FULL_LOCK | The area's memory is locked into RAM when the area is created, and won't be swapped out. |
B_CONTIGUOUS | Not only is the area's memory locked into RAM, it's also guaranteed to be contiguous. This is particularly—and perhaps exclusively—useful to designers of certain types of device drivers. |
B_LAZY_LOCK | Allows individual pages of memory to be brought into RAM through the natural order of things and then locks them. |
B_NO_LOCK | Pages are never locked, they're swapped in and out as needed. |
B_LOMEM | This is a special constant that's used for for areas that need to be locked, contiguous, and that fit within the first 16MB of physical memory. The folks that need this constant know who they are. |
If create_area() is successful, the new area_id number is returned. If it's unsuccessful, one of the following error constants is returned.
RETURN CODES
See also: clone_area()
|
Deletes the designated area. If no one other area maps to the physical memory that this area represents, the memory is freed. After being deleted, the area value is invalid as an area identifier.
|
RETURN CODES
|
Returns an area that has a name that matches the argument. Area names needn't be unique—successive calls to this function with the same argument value may not return the same area_id.
What you do with the area you've found depends on where it came from:
RETURN CODES
See also: area_for()
|
Copies information about a particular area into the area_info structure designated by info. The first version of the function designates the area directly, by area_id.
The get_next_area_info() version lets you step through the list of a team's areas through iterated calls on the function. The team argument identifies the team you want to look at; a team value of 0 means the team of the calling thread. The cookie argument is a placemark; you set it to 0 on your first call, and let the function do the rest. The function returns B_BAD_VALUE when there are no more areas to visit:
/* Get the area_info for every area in this team. */ area_info info; int32 cookie = 0; while (get_next_area_info(0, &cookie, &info) == B_OK) ...
The area_info structure is:
|
The fields are:
The final four fields give information about the area that's useful in diagnosing system use. The fields are particularly valuable if you're hunting for memory leaks:
RETURN CODES
|
Sets the size of the designated area to new_size, measured in bytes. The new_size argument must be a multiple of B_PAGE_SIZE (4096).
Size modifications affect the end of the area's existing memory allocation: If you're increasing the size of the area, the new memory is added to the end of area; if you're shrinking the area, end pages are released and freed. In neither case does the area's starting address change, nor is existing data modified (except, of course, for data that's lost due to shrinkage).
Resizing affects all areas that refer to this areas physical memory. For example, if B is a clone of A, and you resize A, B will be automatically resized (if possible).
RETURN CODES
|
Sets the given area's read and write protection. The new_protection argument is a mask that specifies one or both of the values B_READ_AREA and B_WRITE_AREA. The former means that the area can be read; the latter, that it can be written to. An area's protection only applies to access to the underlying memory through that specific area. Different area clones that refer to the same memory may have different protections.
RETURN CODES
The Kernel Kit Table of Contents | The Kernel Kit Index |
Copyright © 2000 Be, Inc. All rights reserved..