|
vm_map_pageable(9r)
Contents
|
vm_map_pageable - General: Sets pageability of the specified
address range
kern_return_t vm_map_pageable(
vm_map_t map,
vm_offset_t start,
vm_offset_t end,
vm_prot_t access_type );
Specifies the address map associated with an individual
process. Specifies the starting address of an address
range. Typically, this is the address of the user's buffer
where the DMA operation occurs. Specifies the ending
address of a consecutive range of addresses beginning with
the start argument. Specifies the access mode to be set
for memory specified by the start and end arguments. You
can set this argument to VM_PROT_NONE or to the bitwise
inclusive OR of the protection bits VM_PROT_READ and
VM_PROT_WRITE. These bits are defined in the file
<mach/vm_prot.h> and have the following meanings: Modifies
the memory attributes so that the specified range of
addresses is no longer locked. This should be done after
the DMA operation has completed. Verifies that the
specifed range of addresses is readable by the specified
process. If so, the range of addresses is locked in memory
to remain stable throughout the DMA operation. Verifies
that the specifed range of addresses is writable by the
specified process. If so, the range of addresses is locked
in memory to remain stable throughout the DMA operation.
Verifies that the specifed range of addresses is readable
and writable by the specified process. If so, the range of
addresses is locked in memory to remain stable throughout
the DMA operation.
The vm_map_pageable routine ensures that the address range
you specified in the start and end arguments is accessible.
If the address range is accessible by the specified
process, the memory associated with this address range
will have its locked attributes modified as specified by
the access_type argument. A kernel module can call this
routine prior to performing a DMA operation to ensure
that: The currently running process has read or write
access permission to the user's buffer The memory representing
the user's buffer is locked so that it remains
available throughout the DMA operation.
This routine may block in the kernel. Therefore, you
should release all locks and lower the SPL before calling
vm_map_pageable. When the routine returns, you should
relock the data and check the data integrity.
Upon successful completion, the vm_map_pageable routine
returns the value 0 (zero). Otherwise, it returns a
nonzero value to indicate an error.
The following code fragment shows how the vm_map_pageable
routine ensures that the user's buffer is accessible to
cause the corresponding memory to be locked:
if (vm_map_pageable(current_task()->map,
trunc_page(bp->b_un.b_addr),
round_page(bp->b_un.b_addr +
(int)bp->b_bcount),
(bp->b_flags == B_READ ? VM_PROT_READ :
VM_PROT_WRITE))) {
/***************************************************
* Here you implement the code to perform the *
* actual DMA operation. Upon conclusion of the *
* DMA operation, add the following code to *
* release the locked attribute. *
***************************************************/
if (vm_map_pageable(current_task()->map,
trunc_page(bp->b_un.b_addr),
round_page(bp->b_un.b_addr +
(int)bp->b_bcount),
VM_PROT_NONE)) {
Routines: current_task(9r), round_page(9r), trunc_page(9r)
vm_map_pageable(9r)
[ Back ] |