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.
_XchgFreePhysReg
◄Up► ◄Next► ◄Previous►
────────────────────────────────────────────────────────────────────────────
include vmm.inc
VMMcall _XchgFreePhysReg, <LinPgNum, PhysAddr, flags>
cmp eax, 0FFFFFFFFh ; 0FFFFFFFFh if error
je not_exchanged
mov [PageTable], eax ; previous page table entry
The _XchgFreePhysReg service replaces the current physical address in a page
table entry with a new physical address. A virtual device typically uses
this service to compact a free physical region by assigning pages that are
present to adjacent linear addresses (that is, by removing not-present pages
from between present pages).
This is an asynchronous service.
Parameter Description
────────────────────────────────────────────────────────────────────────────
LinPgNum Specifies the linear page number of the first page in the region
to exchange. A linear page number is a linear address shifted
right by 12 bits. The specified page must be within a free
physical region previously allocated using the _PageAllocate
service.
PhysAddr Specifies the physical address to insert into the page table
entry specified by LinPgNum. This parameter must be a 32-bit
physical address. If this parameter is zero, the service makes
the page not present.
flags Specifies the operation flags. This parameter must be set to 0.
Return Value
The EAX register contains the previous physical address for the specified
page if the service is successful. If the specified page is not present, EAX
contains zero. Otherwise, EAX contains 0FFFFFFFFh to indicate an error, such
as an invalid linear page number.
Comments
A virtual device typically makes a series of calls to _XchgFreePhysReg,
using the physical address return by one call as the parameter in the next
call. To start the series, the virtual device sets the PhysAddr parameter to
zero, and specifies a page known to be present. This forces the present page
to be not present. The virtual device continues calling the service,
specifying different page numbers, until the service returns 0.
This service cannot be used to change the number of pages which were mapped
using the PageFixed value with the _MapFreePhysReg service.
The virtual pageswap device uses this service to read ahead and write behind
without having to copy data. Using the _XchgFreePhysReg service in this way
is restricted to the virtual pageswap device.
Failure to use this service properly can result in invalid page faults and
loss of pages.
Uses
EAX
See Also
_MapFreePhysReg, _PageAllocate
♦