I want to allocate non paged physically contiguous memory in system memory in
"user mode". Can any one suggest me the API through which we can
achieve this, or the way we can achieve this.
I know that we can achieve this in kernel mode using the API
In user space (ring 3), there is no such requirement. User space
uses virtual addresses, and the physical memory referenced by
a virtual address, doesn't have to be contiguous. Only a driver
writer would care to make the PA addresses contiguous (and only
for the benefit of some dumb DMA circuits). Ordinary program
writers, are "insulated" from hardware, and only care that the
virtual addresses are contiguous. In this example, my program
gets what looks like four contiguous storage locations, even though
there in two different areas of physical memory.
CPU --> VA TLB PA
You don't write drivers in user space. You write them in
kernel space (ring 0) and in there, the MmAllocateContiguousMemory
can help you define contiguous addresses, for hardware which
lacks scatter/gather DMA support. Perhaps something like
the AGP GART, would have been an example of an area needing
something like MmAllocateContiguousMemory.
PA <--- DMA hardware, PCI bus
0x23 (for architectures where the peripherals
0x24 chips don't have access to a mapper or TLB.)
0x26 A few processors now, have an IOMMU, to add
the ability to do translations here. But
since not all processors have an IOMMU, it's
not a feature the OS can rely on. Having an
IOMMU, avoids the need for bounce buffers.