Discussions on more advanced topics such as monolithic vs micro-kernels, transactional memory models, and paging vs segmentation should go here. Use this forum to expand and improve the wiki!
// The Signature of the PXENV+ structure - contains "PXENV+".
uint8_t Signature[6];
// The MSB contains the Major version number, while the LSB contains the minor version number.
uint16_t Version;
// The Length and the checksum of the structure, used for calculating the checksum.
uint8_t Length;
uint8_t Checksum;
// A Far Pointer to the real mode PXE API entry point.
uint32_t RMEntry;
// 32-bit offset to the protected mode API entry point. Instead of this, the !PXE structure is recommended.
uint32_t PMOffset;
// The rest of the fields don't matter much, and the Specifications can be referred.
uint16_t PMSelector;
uint16_t StackSeg;
uint16_t StackSize;
uint16_t BCCodeSeg;
uint16_t BCCodeSize;
uint16_t BCDataSeg;
uint16_t BCDataSize;
uint16_t UNDIDataSeg;
uint16_t UNDIDataSize;
uint16_t UNDICodeSeg;
uint16_t UNDICodeSize;
// This is a far pointer to the "!PXE" structure, only present when the structure is present.
uint32_t PXEPtr;
When I was in the Protected mode, I switched to real mode for PXE interrupt. After that es and ebx registers got the address of PXENV+ structure.
Then I want to use PXEPtr that has incorrect address. But there is correct Signature, Length, Checksum in PXENV+ structure but PXEPtr has incorrect address or in VMWare workstation PXEPtr has address of PXENV+ structure.
struct __attribute__((__packed__)) PXE_ENV{
// The Signature of the PXENV+ structure - contains "PXENV+".
uint8_t Signature[6];
// The MSB contains the Major version number, while the LSB contains the minor version number.
uint16_t Version;
// The Length and the checksum of the structure, used for calculating the checksum.
uint8_t Length;
uint8_t Checksum;
// A Far Pointer to the real mode PXE API entry point.
uint32_t RMEntry;
// 32-bit offset to the protected mode API entry point. Instead of this, the !PXE structure is recommended.
uint32_t PMOffset;
// The rest of the fields don't matter much, and the Specifications can be referred.
uint16_t PMSelector;
uint16_t StackSeg;
uint16_t StackSize;
uint16_t BCCodeSeg;
uint16_t BCCodeSize;
uint16_t BCDataSeg;
uint16_t BCDataSize;
uint16_t UNDIDataSeg;
uint16_t UNDIDataSize;
uint16_t UNDICodeSeg;
uint16_t UNDICodeSize;
// This is a far pointer to the "!PXE" structure, only present when the structure is present.
uint32_t PXEPtr;
};