|
|
< Previous PageNext Page > |
Warning: This section describes the low-level API for dealing with Mach VM maps. These maps cannot be modified in this way from a kernel extension. These functions are not available for use in a KEXT. They are presented strictly for use within the VM system and other parts of Mach. If you are not doing in-kernel development, you should be using the methods described in the chapter “Boundary Crossings”.
From the context of the kernel (not from a KEXT), there are two maps that you will probably need to deal with. The first is the kernel map. Since your code is executing in the kernel’s address space, no additional effort is needed to use memory referenced in the kernel map. However, you may need to add additional mappings into the kernel map and remove them when they are no longer needed.
The second map of interest is the memory map for a given task.
This is of most interest for code that accepts input from user programs,
for example a sysctl
or
a Mach RPC handler. In nearly all cases, convenient wrappers provide
the needed functionality, however.
The low-level VM map API includes the following functions:
kern_return_t vm_map_copyin(vm_map_t src_map, vm_offset_t src_addr, |
vm_size_t len, boolean_t src_destroy, |
vm_map_copy_t *copy_result); |
kern_return_t vm_map_copyout(vm_map_t map, vm_offset_t *addr, /* Out */ |
register vm_map_copy_t copy); |
kern_return_t vm_map_copy_overwrite(vm_map_t dst_map, |
vm_offset_t dst_address,vm_map_copy_t copy, |
boolean_t interruptible, pmap_t pmap); |
void vm_map_copy_discard(vm_map_copy_t copy); |
void vm_map_wire(vm_map_t map, vm_offset_t start, vm_offset_t end, |
vm_prot_t access_type, boolean_t user_wire); |
void vm_map_unwire(vm_map_t map, vm_offset_t start, vm_offset_t end, |
boolean_t user_wire); |
The function vm_map_copyin
copies
data from an arbitrary (potentially non–kernel) memory map into
a copy list and returns the copy list pointer in copy_result
.
If something goes wrong and you need to throw away this intermediate
object, it should be freed with vm_map_copy_discard
.
In order to actually get the data from the copy list, you
need to overwrite a memory object in the kernel’s address space
with vm_map_copy_overwrite
. This overwrites
an object with the contents of a copy list. For most purposes, the
value passed for interruptible
should be FALSE
,
and pmap
should be NULL
.
Copying data from the kernel to user space is exactly the
same as copying data from user space, except that you pass kernel_map
to vm_map_copyin
and
pass the user map to vm_map_copy_overwrite
.
In general, however, you should avoid doing this, since you could end
up with a task’s memory being fragmented into lots of tiny objects,
which is undesirable.
Do not use vm_map_copyout
when
copying data into an existing user task’s address map. The function vm_map_copyout
is
used for filling an unused region in an address map. If the region
is allocated, then vm_map_copyout
does
nothing. Because it requires knowledge of the current state of the
map, it is primarily used when creating a new address map (for example,
if you are manually creating a new process). For most purposes,
you do not need to use vm_map_copyout
.
The functions vm_map_wire
and vm_map_unwire
can
be used to wire and unwire portions of an address map. If you set
the argument user_wire
to TRUE
,
then the page can be unwired from user space. This should be set
to FALSE
if you are about
to use the memory for I/O or for some other operation that cannot
tolerate paging. In vm_map_wire
,
the argument access_type
indicates
the types of accesses that should not be allowed to generate a page fault.
In general, however, you should be using vm_wire
to
wire memory.
As mentioned earlier, this information is presented strictly for use in the heart of the kernel. You should not use anything in this section from a kernel extension.
< Previous PageNext Page > |
Last updated: 2006-11-07
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |