Port-amigappc archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Design papers: kernel memory map and kernel relocator
Hello,
after discussing the kernel memory map with Wolfgang Solfrank (whom I cc:)
and how to do a relocator with Michael Rock, I edited the memory map document
and wrote a relocator document, which I enclose for your final comment.
Knowledge of the bebox/macppc/ofwppc pmap modules is assumed.
Regards,
Ignatios
$Id: kernel-address-map,v 1.5 1999/01/26 20:33:44 is Exp $
NetBSD/amigappc virtual kernel addressing:
==========================================
Addresses given are high 16 bits.
Range Cache Description real range
0000 - 03f0 0 Amiga I/O + chipmem + Z2mem 0000 - 00ff *
0400 - 07ff 1 A3000/4000 mainboard. memory 0700 - 07ff
0800 - 0fff 1 CPU-slot-memory on A[34]000
1000 - 7fff 0/1 Z3-i/o or. memory-boards
Blizzard PPC memory
d000 - dfff 1 userland window, non-BAT
e000 - efff 1 kernel map, non-BAT
fc00 - ffff 1 exception code, bootstrappig fff0 - fff7
The software BAT table contains pieces for 64MB segments, but uses
bigger pieces if adjacent, to reduce trap frequency. E.g.:
highbits range inserted into BAT register
------------------------------------------------
0400 0400 - 07ff
0800 0800 - 0fff
0C00 0800 - 0fff
The kernel is linked to its memory segment base address.
In a later version, it will relocate itself during startup.
$Id: kernel-relocator,v 1.1 1999/01/26 20:58:16 is Exp is $
Kernel relocation:
==================
The first thing the kernel will do, eventually, is to relocate itself.
[Until then you'll have to link the kernel for the memory you'll be using.]
Pseudo-code of kernel-startup (but would be in assembler code, I think):
--------
register vaddr_t thediff;
register u_int16_t highdiff;
register vaddr_t whereami;
register u_int16_t *q, **p;
u_int16_t **reloctable;
thediff = whereami - addresskernelislinkedfor;
p = reloctable + thediff; /* we're not relocated yet */
highdiff = thediff >> 16;
while (q = *p++) {
q += thediff; /* where is that address really */
*q += highdiff; /* adjust the high bits */
}
--------
reloctable is an array of pointers pointing to the high 16 bits of
addresses, generated during compile time by a magic program out of
the PPC_RELOC_16_UPPER and the 32bit relocation records. We won't
have "absolute" 16bit branches (other than maybe _into_ the exception
table, which dont need to be relocated anyway).
magic-program would either be written in C, linking to libbfd to get at the
interesting stuff, or even a shell + awk + sed script operating on objdump
output. The latter helps setting up cross compilation.
Link procedure:
ld -r -dc -o netbsd-intermediate.o kernelstartup.o $OTHEROBJECTS
magic-program -o reloctable.s netbsd-intermediate.o
as -o reloctable.o reloctable.s
ld -o netbsd netbsd-intermediate.o reloctable.o
[-r: link and resolve everything internal, but keep relocation info.
-dc: allocate space for common symbols, anyway.]
Home |
Main Index |
Thread Index |
Old Index