Symmetric Multiprocessing: Difference between revisions

m
Bot: Replace deprecated source tag with syntaxhighlight
[unchecked revision][unchecked revision]
m (Fix 403 for the Multiprocessor Spec)
m (Bot: Replace deprecated source tag with syntaxhighlight)
 
(One intermediate revision by the same user not shown)
Line 22:
Some information (which may not be present on newer machines) dedicated for multiprocessing is available. First one must find the MP Floating Pointer Structure. It is aligned on a 16 byte boundary, and contains a signature at the start "_MP_" or 0x5F504D5F. The OS must search in the EBDA, the BIOS ROM space, and last kilobyte of "base memory"; the size of base memory is specified in a 2 byte value at 0x413 in kilobytes, minus 1K.
Here is what the structure looks like:
<sourcesyntaxhighlight lang="c">
struct mp_floating_pointer_structure {
char signature[4];
Line 34:
// virtual wire mode is; all other bits are reserved
}
</syntaxhighlight>
</source>
Here is what the configuration table, pointed to by the floating pointer structure looks like:
<sourcesyntaxhighlight lang="c">
struct mp_configuration_table {
char signature[4]; // "PCMP"
Line 52:
uint8_t reserved;
}
</syntaxhighlight>
</source>
After the configuration table, there are entry_count entries describing more information about the system, then after that there is an extended table. The entries are either 20 bytes to represent a processor, or 8 bytes for something else. Here are what the processor and IO APIC entries look like.
<sourcesyntaxhighlight lang="c">
struct entry_processor {
uint8_t type; // Always 0
Line 65:
uint64_t reserved;
}
</syntaxhighlight>
</source>
Here is an IO APIC entry.
<sourcesyntaxhighlight lang="c">
struct entry_io_apic {
uint8_t type; // Always 2
Line 75:
uint32_t address; // The memory mapped address of the IO APIC is memory
}
</syntaxhighlight>
</source>
For more information, see http://www.intel.com/design/pentium/datashts/24201606.pdf, chapter 4.
 
Line 102:
 
=== BSP Initialization Code ===
<sourcesyntaxhighlight lang="c">
volatile uint8_t aprunning = 0; // count how many APs have started
uint8_t bspid, bspdone = 0; // BSP id and spinlock flag
Line 136:
bspdone = 1;
// now you'll have the number of running APs in 'aprunning'
</syntaxhighlight>
</source>
 
=== AP Initialization Code ===
As the application processors start up in real mode, a little Assembly is needed to enter protected mode. Modify this example to your kernel's needs.
<sourcesyntaxhighlight lang="asm">
; this code will be relocated to 0x8000, sets up environment for calling a C function
.code16
Line 189:
; jump into C code (should never return)
ljmp $8, $ap_startup
</syntaxhighlight>
</source>
<sourcesyntaxhighlight lang="C">
// this C code can be anywhere you want it, no relocation needed
void ap_startup(int apicid) {
Line 196:
while(1);
}
</syntaxhighlight>
</source>
 
==See Also==