The BMP is a generalised facility used to manage tables of fixed length entities. The BMP consists of a header followed by the table it manages. The use of the BMP is many and varied, but almost always occurs where an expandable table of fixed length entries is required by the system.
Pointers
VMBH BMP Header Structure.
┌────────────────┬──────┬──────┬────┬────────────────────────────────────────┐│Field Name │Offset│Length│Type│Description │ ├────────────────┼──────┼──────┼────┼────────────────────────────────────────┤ │bh_pbFreeHead │+0 │4 │D │Free list pointer │ ├────────────────┼──────┼──────┼────┼────────────────────────────────────────┤ │bh_pbEndBlocks │+4 │4 │D │End of valid blocks │ ├────────────────┼──────┼──────┼────┼────────────────────────────────────────┤ │bh_pbEndVirt │+8 │4 │D │End of virtual memory │ ├────────────────┼──────┼──────┼────┼────────────────────────────────────────┤ │bh_pbLastBusy │+C │4 │D │Pointer to last busy block │ ├────────────────┼──────┼──────┼────┼────────────────────────────────────────┤ │bh_pfnisbusy │+10 │4 │D │Busy block identifier function │ ├────────────────┼──────┼──────┼────┼────────────────────────────────────────┤ │bh_filler │+14 │4 │D │Paragraph boundary filler │ ├────────────────┼──────┼──────┼────┼────────────────────────────────────────┤ │bh_flpgtype │+18 │4 │D │New page type flags │ ├────────────────┼──────┼──────┼────┼────────────────────────────────────────┤ │bh_cbPerBlock │+1c │2 │W │Size of a block in bytes │ ├────────────────┼──────┼──────┼────┼────────────────────────────────────────┤ │bh_hob │+1e │2 │W │Object record handle │ └────────────────┴──────┴──────┴────┴────────────────────────────────────────┘
bh_flpgtype flag definitions.
┌──────────────┬──────────┬─────────────────────────────────┐ │Name │Bit Mask │Description │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_CONTIG │0x00000001│contiguous physical memory │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_NOINCR │0x00000001│don't increment physical addrs │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_W │0x00000002│Writable - value from pte │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_U │0x00000004│user mode accessible - from pte │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_X │0x00000008│eXecutable │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_R │0x00000010│Readable │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_1M │0x00000020│must reside below 1 meg physical │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_GUARD │0x00000040│guard page - from pte │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_16M │0x00000040│must reside below 16 meg physical│ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_ZEROFILL │0x00000080│zero initialize pages │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_SWAPONWRITE│0x00000100│value from vp │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_UVIRT │0x00000200│value from pte │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_RESIDENT │0x00000400│value from pte │ ├──────────────┼──────────┼─────────────────────────────────┤ │PG_DISCARDABLE│0x00000800│value from vp │ └──────────────┴──────────┴─────────────────────────────────┘