Master initialiser for all variants of memory descriptors.


static IOMemoryDescriptor *withOptions(
 void *buffers, 
 IOMapper *mapper = mapper); 



A pointer to an array of IOAddressRange when options:type is kIOMemoryTypeVirtual64 or kIOMemoryTypePhysical64 or a 64bit kernel. For type UPL it is a upl_t returned by the mach/memory_object_types.h apis, primarily used internally by the UBC. IOVirtualRanges or IOPhysicalRanges are 32 bit only types for use when options:type is kIOMemoryTypeVirtual or kIOMemoryTypePhysical on 32bit kernels.


options:type = Virtual or Physical count contains a count of the number of entires in the buffers array. For options:type = UPL this field contains a total length.


Only used when options:type = UPL, in which case this field contains an offset for the memory within the buffers upl.


Only used options:type = Virtual, The task each of the virtual ranges are mapped into.


kIOMemoryDirectionMask (options:direction) This nibble indicates the I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. kIOMemoryTypeMask (options:type) kIOMemoryTypeVirtual64, kIOMemoryTypeVirtual, kIOMemoryTypePhysical64, kIOMemoryTypePhysical, kIOMemoryTypeUPL Indicates that what type of memory basic memory descriptor to use. This sub-field also controls the interpretation of the buffers, count, offset & task parameters. kIOMemoryAsReference For options:type = Virtual or Physical this indicate that the memory descriptor need not copy the ranges array into local memory. This is an optimisation to try to minimise unnecessary allocations. kIOMemoryBufferPageable Only used by the IOBufferMemoryDescriptor as an indication that the kernel virtual memory is in fact pageable and we need to use the kernel pageable submap rather than the default map.


Which IOMapper should be used to map the in-memory physical addresses into I/O space addresses. Defaults to 0 which indicates that the system mapper is to be used, if present.

Return Value

The created IOMemoryDescriptor on success, to be released by the caller, or zero on failure.


This method creates and initializes an IOMemoryDescriptor for memory it has three main variants: Virtual, Physical & mach UPL. These variants are selected with the options parameter, see below. This memory descriptor needs to be prepared before it can be used to extract data from the memory described.

See Also


- complete

Complete processing of the memory after an I/O transfer finishes.

- createMappingInTask

Maps a IOMemoryDescriptor into a task.

- getDirection

Accessor to get the direction the memory descriptor was created with.

- getLength

Accessor to get the length of the memory descriptor (over all its ranges).

- getPageCounts

Retrieve the number of resident and/or dirty pages encompassed by an IOMemoryDescriptor.

- getPhysicalAddress

Return the physical address of the first byte in the memory.

- getPhysicalSegment

Break a memory descriptor into its physically contiguous segments.

- getTag

Accessor to the retrieve the tag for the memory descriptor.

- initWithOptions

Master initialiser for all variants of memory descriptors. For a more complete description see IOMemoryDescriptor::withOptions.

- map

Maps a IOMemoryDescriptor into the kernel map.

- performOperation

Perform an operation on the memory descriptor's memory.

- prepare

Prepare the memory for an I/O transfer.

- readBytes

Copy data from the memory descriptor's buffer to the specified buffer.

- setMapping

Establishes an already existing mapping.

- setPurgeable

Control the purgeable status of a memory descriptors memory.

- setTag

Set the tag for the memory descriptor.

- withAddress

Create an IOMemoryDescriptor to describe one virtual range of the kernel task.

- withAddressRange

Create an IOMemoryDescriptor to describe one virtual range of the specified map.

- withAddressRanges

Create an IOMemoryDescriptor to describe one or more virtual ranges.

- withPersistentMemoryDescriptor

Copy constructor that generates a new memory descriptor if the backing memory for the same task's virtual address and length has changed.

- withPhysicalAddress

Create an IOMemoryDescriptor to describe one physical range.

- writeBytes

Copy data to the memory descriptor's buffer from the specified buffer.