A specific list of changes in Mac OS 8.1 is given in
Apple's document
"tn1121.html". As far as we
have been able to determine, OS 8.1 is almost a transparent
upgrade as far as RAM Charger is concerned - having only one
visible symptom which occurs under PowerPC with Virtual
Memory (VM) enabled. The applicable change, noted in
"tn1121.html", is the new
ReleaseMemoryData call provided for Virtual Memory.
The Details
RAM Charger needs to access the information in an
application's partition at the last possible moment during
"quit" to clean up any expanded memory. We must wait as long
as possible so that we may leave the memory available for
the application's use.
Prior to OS 8.1 the "starting partition" memory reserved
for each application was invalidated during the application
"quit" (_ExitToShell) by a call to either "_DisposeHandle"
or "_BlockMove". In all cases, an application's partition is
a Locked-Relocatable-Block reserved in the ProcessZone.
Previously, the data within the block would remain valid up
until the time the system disposed the Handle, or used
BlockMove to copy data into the block.
In OS 8.1 with PowerPC and VM enabled, a new call to the
"VM" trap "_MemoryDispatch" invalidates the memory within
the application's partition before "_DisposeHandle" is
called. In specific, the new routine is given the abstract
name ReleaseMemoryData ("_MemoryDispatch" with selector
D0==$000C). Apple writes: "If the released range is
subsequently accessed, the values in memory will be
unpredictable.".
Our Solution In RAM Charger 8.1
We had to enhance RAM Charger to cleanup up in the case
of the new ReleaseMemoryData. If we waited until
"_DisposeHandle" in the new OS 8.1 with PowerPC and VM
enabled, the "partition data" might be invalid and improper
cleanup could result in an unstable system.
Discussion
The new ReleaseMemoryData call releases the tie to
backing storage for a range of virtual memory. This is the
reverse of FileMapping, and as valuable since it will speed
up the system by avoiding fruitless paging.
During application "quit", the new ReleaseMemoryData call
is applied to range of memory, resulting in access to that
memory not restoring paged out data. Instead, any random
available memory may be assigned to the address range,
without having to restore that data previously written to
the address range. This yields the memory unpredictable, or
"trashed".
In the case where we have seen this used, it is
legitimate for this ReleaseMemoryData to basically trash
memory. The call is made just before "DisposeHandle" on a
block of memory that is a defunct application partition.
The good part is that this new ReleaseMemoryData
optimization can speed up operation of your machine
subsequent to quitting an application since any memory
within the application's partition does not need to be
restored after the application quits (when the memory is
re-used). If the call were not made, then the system would
have to read back in any "defunct" data that was paged out
when the block data would next be used.
The bad part is that any code that depends on data
remaining constant in a block of memory must beware of this
new ReleaseMemoryData. However, we suspect Apple will (does)
use it with caution, and very little code will have
dependency.
You may download the version 8.1 software
here.
This is a free update to RAM Charger 8 owners.
|