A mechanism to convert memory references to physical addresses.
- macOS 10.0+
The IOMemoryCursor declares the super class that all specific memory cursors must inherit from, but a memory cursor can be created without a specific format subclass by just providing a segment function to the initializers. This class does the difficult stuff of dividing a memory descriptor into a physical scatter/gather list appropriate for the target hardware.
A driver is expected to create a memory cursor and configure it to the limitations of its DMA hardware; for instance the memory cursor used by the FireWire SBP-2 protocol has a maximum physical segment size of 2^16 - 1 but the actual transfer size is unlimited. Thus it would create a cursor with a maxSegmentSize of 65535 and a maxTransfer size of UINT_MAX. It would also provide a SegmentFunction that can output a pagelist entry.
Below is the simplest example of a SegmentFunction:
void IONaturalMemoryCursor::outputSegment(PhysicalSegment segment,
void * outSegments,
((PhysicalSegment *) outSegments)[outSegmentIndex] = segment;