home | list info | list archive | date index | thread index

[OCLUG-Tech] Re: 1. One last Power on Question. (William Case)

As I understand it, the legacy x86 processor can only indicate IO accesses or MEMORY accesses. Of and by itself, it has no idea where, why, and how data goes during the access, just that the access completes. So, the power-on default programmed counter value loaded, is 0xffff00. Written as 16B page style: ffff:0000. Manufacturers make every x86 compatible chip power-on reset to the same location and in a known state.
But the 'PC' architecture usually has a special chip, often known as the "north 
bridge" connected directly to the x86. "North" refers to how the north-up way 
most x86 pictures are drawn. The north bridge catches the x86's access, and 
then compares it's Address Registers for a matching address and type of access. 
A match turns into a bus cycle: commands, addresses, chip-selects, Read/Write 
strobes, whatever it takes, to complete the access. But at power-on reset time, 
none of this is enabled.
Instead, the north bridge has a power-on default. One such default is a global 
match on every memory access to a specific chip-select ("boot select"), with 
defaulted access timing to match very slow a very simple memory part. The 
selected part, usually ROM, ignores all but the least significant part of the 
address that's presented to it, and responds with whatever was programmed into 
that location, 0x3ff00 or something like it.
Why the leading '3'? In the PC world, often the ROM only uses the least 16 or 
so address bits, and often they even ignore the very least two address bits. 
Doing this, they always return 4 bytes (32b) per access, because the x86 cpu 
usually wants data in 32b chunks. Sometimes the bytes are in separate 
byte-lanes, sometimes aggregated into one big bus. But because of the upper 
addresses are ignored, the x86 can always get the ROM to respond, and the '3' 
in this example, is all of subset of the 0xffff00 that the ROM uses.
Why ROM? All it requires is a chip-select, output-enable and address signals 
(and power) to produce data for the x86 to consume. Very simple. Almost every 
other memory type requires more signals, like a read/write signal, probably 
clocks, specific timeing, and some programming of the north bridge or more to 
make it work. That's the work of a BIOS--to do that programming, find and turn 
on all of the registers and other memory types.
Why is the first thing usually a JUMP of some kind? First of all, with no 
writeable memory type configured yet, there is no place for the x86 to store 
information about where it is and what it is doing. The only way to get to the 
place where a code to configure memory, is to overwrite the program counter 
with that place's address. A JUMP instruction does this. Secondly, the 
FFFF:0000 address is only 256B from the end of memory. Too small a space to put 
kind of initialization program like the BIOS. So it makes sense to JUMP to 
someplace where there's space for more code.