Virtual Devices (3.1) (vdag31qh.hlp) (
Table of Contents;
Topic list)
Important Notice
The pages on this site contain documentation for very old MS-DOS software,
purely for historical purposes.
If you're looking for up-to-date documentation, particularly for programming,
you should not rely on the information found here, as it will be woefully
out of date.
_PageAllocate
◄Up► ◄Next► ◄Previous►
────────────────────────────────────────────────────────────────────────────
include vmm.inc
VMMcall _PageAllocate, <nPages, pType, VM, AlignMask, minPhys,
maxPhys, <OFFSET32 PhysAddr>, flags>
mov ecx, eax ; zero in eax and edx if error
or ecx, edx
jz error
mov [Handle], eax ; memory handle
mov [Address], edx ; ring-0 address of memory block
The _PageAllocate service allocates a block of memory consisting of the
specified number of pages. This service reserves linear address space for
the memory block, and depending on the value of the flags parameter, may
also map the linear addresses to physical memory, locking the pages in
memory. The service returns a memory handle that can be used in subsequent
memory management functions to lock, unlock, reallocate, and free the memory
block.
Parameter Description
────────────────────────────────────────────────────────────────────────────
nPages Specifies the number of pages to allocate for the memory block.
This parameter must not be zero.
pType Specifies the type of pages to allocate. It can be one of the
following values:
Value Meaning
─────────────────────────────────────────────────────────────────
PG_VM Allocates pages that are specific to a particular
virtual machine. The handle of PG_VM memory blocks
will typically be placed in the virtual machine's
control block.
PG_SYS Allocates global system pages that are valid in all
virtual machines.
PG_HOOKED Allocates pages that are mapped into the virtual
machine at locations for which a page-fault handler
has been installed. These pages are specific to a
particular virtual machine.
VM Specifies a handle identifying the virtual machine for which to
allocate the pages. This parameter applies to pages allocated
using the PG_VM and PG_HOOKED values only. This parameter must be
set to zero when using the PG_SYS value.
AlignMask Specifies an alignment mask that defines acceptable starting page
numbers for the memory block. This parameter can be one of the
following values:
Value Meaning
─────────────────────────────────────────────────────────────────
00000000h Physical address is a multiple of 4K.
00000001h Physical address is a multiple of 8K.
00000003h Physical address is a multiple of 16K.
00000007h Physical address is a multiple of 32K.
0000000Fh Physical address is a multiple of 64K.
0000001Fh Physical address is a multiple of 128K.
This parameter is used only if the flags parameter specifies the
PageUseAlign value.
minPhys Specifies the minimum acceptable physical page number in the
memory block. All page numbers must be greater than or equal to
this value. This parameter is used only if the flags parameter
specifies the PageUseAlign value.
maxPhys Specifies the maximum acceptable physical page number in the
memory block. All page numbers must be less than this value. This
parameter is used only if the flags parameter specifies the
PageUseAlign value.
PhysAddr Points to the four-byte buffer to receive the physical address of
the start of the memory block. The service uses this parameter
only if the flags parameter specifies the PageUseAlign value.
flags Specifies the operation flags. This parameter can be a
combination of the following values:
Value Meaning
─────────────────────────────────────────────────────────────────
PageZeroInit Fills the memory block with zeros. If this
value is not given, the contents of the
memory block are undefined.
PageUseAlign Allocates pages using the alignment and
physical addresses specified by the
AlignMask, minPhys, and maxPhys parameters.
The PageUseAlign value is only available
during initialization and can only be used in
combination with the PageFixed value.
PageContig Allocates contiguous physical pages to create
the memory block. This value is ignored if
the PageUseAlign value is not also
specified.
PageFixed Locks the allocated pages in memory at a
fixed linear address and prevents the pages
from subsequently being unlocked or moved.
The service locks the memory block regardless
of the type of virtual pageswap device
present.
PageLocked Locks the allocated pages in the memory. The
pages can be subsequently unlocked using the
_PageUnLock service. The service locks the
memory block regardless of the type of
virtual pageswap device present.
PageLockedIfDP Locks the allocated pages in the memory only
if the virtual pageswap device uses MS-DOS or
BIOS functions to write to the hardware. If
the pages are locked, they can be
subsequently unlocked using the _PageUnLock
service.
A virtual device must not specify the
PageLockedIfDP value until after it has
received the Init_Complete message.
The PageLocked and PageLockedIfDP values are
mutually exclusive.
PageMapFreePhysReg Allocates a free physical region which a
virtual device may use to map physical pages
that otherwise are placed in the system's
free memory pool. The nPages parameter
specifies the number of pages in the region.
The pType parameter must be set to PG_SYS and
the VM, AlignMask, minPhys, maxPhys, and
PhysAddrPTR parameters must be set to zero. A
free physical region cannot be reallocated or
freed; these regions exist for the duration
of the Windows session.
This value is only available during
initialization, and only in Windows version
3.1 or later.
All other values are reserved.
Return Value
The EAX register contains the memory handle of the block, and the EDX
register contains the ring-0 linear address of the memory block. Otherwise,
the EAX and EDX registers both contain zero to indicate an error such
insufficient memory to satisfy the request.
Comments
Unless PageLocked, PageLockedIfDP, or PageFixed is specified, this service
allocates linear address space without mapping the addresses to physical
memory. In this case, the system maps the physical page when the virtual
device attempts to access an address in the address space. A virtual device
can also use the _PageLock service to force this mapping.
Virtual devices use the PageUseAlign value to allocate buffers for use by
the device which have additional alignment restrictions enforced by the
hardware. For example, a DMA may require buffers to start at addresses that
are a multiple of 64K or 128K. When allocating such buffers, the PageContig
value is often used in combination with PageUseAlign.
The action specified by the PageLockedIfDP value is available only after the
virtual pageswap device has been initialized.
Virtual devices must never rely on apparent relationships between the memory
handle and the ring-0, or physical address of a memory block.
All pages in the free physical region are initially not present. Virtual
devices use the MapFreePhysReg service to map physical pages into the region
and use the UnmapFreePhysReg service to remove pages from the region. Since
the system does not provide a backing store for a free physical region,
unmapping a page makes the previous contents unrecoverable. The
MapFreePhysReg and UnmapFreePhysReg services can only be be used within a
free-physical-region callback procedure installed using the
_SetFreePhysRegCalBk service.
Uses
EAX, EDX
See Also
_PageFree, _PageLock, _PageReAllocate, _PageUnLock
♦