Newer
Older
// Allocate a real stack and switch to it, first
// doing some setup required for memory allocator to work.

Frans Kaashoek
committed
kvmalloc(); // kernel page table
mpinit(); // collect info about this machine
seginit(); // set up segments
cprintf("\ncpu%d: starting xv6\n\n", cpu->id);
picinit(); // interrupt controller
ioapicinit(); // another interrupt controller
consoleinit(); // I/O devices & their interrupts
uartinit(); // serial port
startothers(); // start other processors (must come before kinit; must use enter_alloc)
kinit(); // initialize memory allocator
userinit(); // first user process (must come after kinit)

Frans Kaashoek
committed
// Other CPUs jump here from entryother.S.
seginit();
lapicinit(cpunum());
mpmain();
}
// Common CPU setup code.
static void
mpmain(void)
{
xchg(&cpu->started, 1); // tell startothers() we're up

Frans Kaashoek
committed
extern uchar _binary_entryother_start[], _binary_entryother_size[];

Frans Kaashoek
committed
// The linker has placed the image of entryother.S in
// _binary_entryother_start.

Frans Kaashoek
committed
memmove(code, _binary_entryother_start, (uint)_binary_entryother_size);
// Tell entryother.S what stack to use, the address of mpenter and pgdir;
// We cannot use kpgdir yet, because the AP processor is running in low
// memory, so we use enterpgdir for the APs too. kalloc can return addresses
// above 4Mbyte (the machine may have much more physical memory than 4Mbyte), which
// aren't mapped by enterpgdir, so we must allocate a stack using enter_alloc();
// This introduces the constraint that xv6 cannot use kalloc until after these
// last enter_alloc invocations.
stack = enter_alloc();
*(void**)(code-8) = mpenter;
*(int**)(code-12) = (void *) v2p(enterpgdir);
// wait for cpu to finish mpmain()
// Boot page table used in entry.S and entryother.S.

Frans Kaashoek
committed
// Page directories (and page tables), must start on a page boundary,
// Use PTE_PS in page directory entry to enable 4Mbyte pages.

Frans Kaashoek
committed
__attribute__((__aligned__(PGSIZE)))
// Map VA's [0, 4MB) to PA's [0, 4MB)
[0] = (0) + PTE_P + PTE_W + PTE_PS,
// Map VA's [KERNBASE, KERNBASE+4MB) to PA's [0, 4MB)
[KERNBASE>>PDXSHIFT] = (0) + PTE_P + PTE_W + PTE_PS,

Frans Kaashoek
committed
};