PMap (Page Map) Page

A PMap is the same as an AMap, except that each bit in the PMap tracks 512-byte pages instead of blocks of 64 bytes. Because a page is equivalent to eight 64-byte blocks in size, one PMap appears for every eight AMaps. The purpose of the PMap is to optimize locating frequently-needed free pages for allocating metadata and BTree data structures. PMap pages, similar to AMap pages, are allocated from the data section whose allocation is also mapped in the corresponding AMap.

The PMap works by pre-allocating 4 kilobytes (eight pages) of memory from the AMap at a time. Once the memory is reserved from the AMap, the corresponding byte (eight pages equals 8 bits) in the PMap is zeroed out to indicate reserved pages. Implementations seeking to allocate a page search for bits set to 0 in the PMap to find free pages. The coverage of a PMap page is 2,031,616 bytes (496 * 8 * 512) of data space.

The functionality of the PMap has been deprecated by the Density List. If a Density List is present in the PST file, then implementations SHOULD NOT use the PMap to locate free pages, and SHOULD instead use the Density List instead.<14> However, implementations MUST ensure the presence of PMaps at the correct intervals and maintain valid checksums to ensure backward-compatibility with older clients.

The first PMap of a PST file is located at absolute file offset 0x4600. The following is the structural representation of a PMap page.