The address that needs to be accessed is the last 16 bytes of memory as that is where the reset vector is stored.
The reason that the values for CS are different is because of the differences between 8086/80186 and 80286+ processors. On the 80286 processors and above, there exists a Global Descriptor Table (GDT) which specifies how memory is accessed and utilized on the system. The 8086 did not have a GDT and thus memory access was essentially fixed.
Even in real mode on a 286+ there exists GDT entries.
The base and selector values you refer to are just the base and selector portions of a GDT entry.
Therefore, the reset vector is set differently due to the fact that GDT entries exist and have effects on 286+ processors in all processor modes. On a freshly booted system, the following segment:offset values are used:
8086/80186 (16-bit): 0xFFFF:0x0000
80286 (16-bit): 0xF000:0xFFF0
80386+ (32-bit): 0xFFFFF000:0xFFF0
(64-bit): 0xFFFFFFFFFFFFF000:0xFFF0
Essentially, on 80286 and higher processors the offset and segment values are the same except for the segment value being sign-extended on 32 and 64 bit processors.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…