Initial revision
This commit is contained in:
245
doc/em/mapping.nr
Normal file
245
doc/em/mapping.nr
Normal file
@@ -0,0 +1,245 @@
|
||||
.SN 5
|
||||
.BP
|
||||
.S1 "MAPPING OF EM DATA MEMORY ONTO TARGET MACHINE MEMORY"
|
||||
The EM architecture is designed to be implemented
|
||||
on many existing and future machines.
|
||||
EM memory is highly fragmented to make
|
||||
adaptation to various memory architectures possible.
|
||||
Format and encoding of pointers is explicitly undefined.
|
||||
.P
|
||||
This chapter gives solutions to some of the
|
||||
anticipated problems.
|
||||
First, we describe a possible memory layout for machines
|
||||
with 64K bytes of address space.
|
||||
Here we use a member of the EM family with 2-byte word and pointer
|
||||
size.
|
||||
The most straightforward layout is shown in figure 2.
|
||||
.N 1
|
||||
.DS
|
||||
65534 -> |-------------------------------|
|
||||
|///////////////////////////////|
|
||||
|//// unimplemented memory /////|
|
||||
|///////////////////////////////|
|
||||
ML -> |-------------------------------|
|
||||
| |
|
||||
| | <- LB
|
||||
| stack and local area |
|
||||
| |
|
||||
|-------------------------------| <- SP
|
||||
|///////////////////////////////|
|
||||
|//////// inaccessible /////////|
|
||||
|///////////////////////////////|
|
||||
|-------------------------------| <- HP
|
||||
| |
|
||||
| heap area |
|
||||
| |
|
||||
| |
|
||||
HB -> |-------------------------------|
|
||||
| |
|
||||
| global data area |
|
||||
| |
|
||||
EB -> |-------------------------------|
|
||||
| |
|
||||
| program text | <- PC
|
||||
| |
|
||||
| ( and tables ) |
|
||||
| |
|
||||
| |
|
||||
PB -> |-------------------------------|
|
||||
|///////////////////////////////|
|
||||
|////////// undefined //////////|
|
||||
|///////////////////////////////|
|
||||
0 -> |-------------------------------|
|
||||
|
||||
Figure 2. Memory layout showing typical register
|
||||
positions during execution of an EM program.
|
||||
.DE 2
|
||||
The base registers for the various memory pieces can be stored
|
||||
in target machine registers or memory.
|
||||
.IS
|
||||
.N 1
|
||||
.TS
|
||||
tab(;);
|
||||
l 1 l l l.
|
||||
PB;:;program base;points to the base of the instruction address space.
|
||||
EB;:;external base;points to the base of the data address space.
|
||||
HB;:;heap base;points to the base of the heap area.
|
||||
ML;:;memory limit;marks the high end of the addressable data space.
|
||||
.TE 1
|
||||
.IE
|
||||
The stack grows from high
|
||||
EM addresses to low EM addresses, and the heap the
|
||||
other way.
|
||||
The memory between SP and HP is not accessible,
|
||||
but may be allocated later to the stack or the heap if needed.
|
||||
The local data area is allocated starting at the high end of
|
||||
memory.
|
||||
.P
|
||||
Because EM address 0 is not mapped onto target
|
||||
address 0, a problem arises when pointers are used.
|
||||
If a program pushed a constant, say 6, onto the stack,
|
||||
and then tried to indirect through it,
|
||||
the wrong word would be fetched,
|
||||
because EM address 6 is mapped onto target address EB+6
|
||||
and not target address 6 itself.
|
||||
This particular problem is solved by explicitly declaring
|
||||
the format of a pointer to be undefined,
|
||||
so that using a constant as a pointer is completely illegal.
|
||||
However, the general problem of mapping pointers still exists.
|
||||
.P
|
||||
There are two possible solutions.
|
||||
In the first solution, EM pointers are represented
|
||||
in the target machine as true EM addresses,
|
||||
for example, a pointer to EM address 6 really is
|
||||
stored as a 6 in the target machine.
|
||||
This solution implies that every time a pointer is fetched
|
||||
EB must be added before referencing
|
||||
the target machine's memory.
|
||||
If the target machine has powerful indexing
|
||||
facilities, EB can be kept in a target machine register,
|
||||
and the relocation can indeed be done on
|
||||
every reference to the data address space
|
||||
at a modest cost in speed.
|
||||
.P
|
||||
The other solution consists of having EM pointers
|
||||
refer to the true target machine address.
|
||||
Thus the instruction LAE 6 (Load Address of External 6)
|
||||
would push the value of EB+6 onto the stack.
|
||||
When this approach is chosen, back ends must know
|
||||
how to offset from EB, to translate all
|
||||
instructions that manipulate EM addresses.
|
||||
However, the problem is not completely solved,
|
||||
because a front end may have to initialize a pointer
|
||||
in CON or ROM data to point to a global address.
|
||||
This pointer must also be relocated by the back end or the interpreter.
|
||||
.P
|
||||
Although the EM stack grows from high to low EM addresses,
|
||||
some machines have hardware PUSH and POP
|
||||
instructions that require the stack to grow upwards.
|
||||
If reasons of efficiency urge you to use these
|
||||
instructions, then EM
|
||||
can be implemented with the memory layout
|
||||
upside down, as shown in figure 3.
|
||||
This is possible because the pointer format is explicitly undefined.
|
||||
The first element of a word array will have a
|
||||
lower physical address than the second element.
|
||||
.N 2
|
||||
.DS
|
||||
| | | |
|
||||
| EB=60 | | ^ |
|
||||
| | | | |
|
||||
|-----------------| |-----------------|
|
||||
105 | 45 | 44 | 104 214 | 41 | 40 | 215
|
||||
|-----------------| |-----------------|
|
||||
103 | 43 | 42 | 102 212 | 43 | 42 | 213
|
||||
|-----------------| |-----------------|
|
||||
101 | 41 | 40 | 100 210 | 45 | 44 | 211
|
||||
|-----------------| |-----------------|
|
||||
| | | | |
|
||||
| v | | EB=255 |
|
||||
| | | |
|
||||
|
||||
Type A Type B
|
||||
.sp 2
|
||||
Figure 3. Two possible memory implementations.
|
||||
Numbers within the boxes are EM addresses.
|
||||
The other numbers are physical addresses.
|
||||
.DE 2
|
||||
.A 0 0
|
||||
So, we have two different EM memory implementations:
|
||||
.IS
|
||||
.PS - 4
|
||||
.PT A~-
|
||||
stack downwards
|
||||
.PT B~-
|
||||
stack upwards
|
||||
.PE
|
||||
.IE
|
||||
.P
|
||||
For each of these two possibilities we give the translation of
|
||||
the EM instructions to push the third byte of a global data
|
||||
block starting at EM address 40 onto the stack and to load the
|
||||
word at address 40.
|
||||
All translations assume a word and pointer size of two bytes.
|
||||
The target machine used is a PDP-11 augmented with push and pop instructions.
|
||||
Registers 'r0' and 'r1' are used and suffer from sign extension for byte
|
||||
transfers.
|
||||
Push $40 means push the constant 40, not word 40.
|
||||
.P
|
||||
The translation of the EM instructions depends on the pointer representation
|
||||
used.
|
||||
For each of the two solutions explained above the translation is given.
|
||||
.P
|
||||
First, the translation for the two implementations using EM addresses as
|
||||
pointer representation:
|
||||
.DS
|
||||
.TS
|
||||
tab(:), center;
|
||||
l s l s l s
|
||||
_ s _ s _ s
|
||||
l 2 l 6 l 2 l 6 l 2 l.
|
||||
EM:type A:type B
|
||||
|
||||
|
||||
LAE:40:push:$40:push:$40
|
||||
|
||||
ADP:3:pop:r0:pop:r0
|
||||
::add:$3,r0:add:$3,r0
|
||||
::push:r0:push:r0
|
||||
|
||||
LOI:1:pop:r0:pop:r0
|
||||
::-::neg:r0
|
||||
::clr:r1:clr:r1
|
||||
::bisb:eb(r0),r1:bisb:eb(r0),r1
|
||||
::push:r1:push:r1
|
||||
|
||||
LOE:40:push:eb+40:push:eb-41
|
||||
.TE
|
||||
.DE
|
||||
.BP
|
||||
.P
|
||||
The translation for the two implementations, if the target machine address is
|
||||
used as pointer representation, is:
|
||||
.N 1
|
||||
.DS
|
||||
.TS
|
||||
tab(:), center;
|
||||
l s l s l s
|
||||
_ s _ s _ s
|
||||
l 2 l 6 l 2 l 6 l 2 l.
|
||||
EM:type A:type B
|
||||
|
||||
|
||||
LAE:40:push:$eb+40:push:$eb-40
|
||||
|
||||
ADP:3:pop:r0:pop:r0
|
||||
::add:$3,r0:sub:$3,r0
|
||||
::push:r0:push:r0
|
||||
|
||||
LOI:1:pop:r0:pop:r0
|
||||
::clr:r1:clr:r1
|
||||
::bisb:(r0),r1:bisb:(r0),r1
|
||||
::push:r1:push:r1
|
||||
|
||||
LOE:40:push:eb+40:push:eb-41
|
||||
.TE
|
||||
.DE
|
||||
.P
|
||||
The translation presented above is not intended to be optimal.
|
||||
Most machines can handle these simple cases in one or two instructions.
|
||||
It demonstrates, however, the flexibility of the EM design.
|
||||
.P
|
||||
There are several possibilities to implement EM on machines with
|
||||
address spaces larger than 64k bytes.
|
||||
For EM with two byte pointers one could allocate instruction and
|
||||
data space each in a separate 64k piece of memory.
|
||||
EM pointers still have to fit in two bytes,
|
||||
but the base registers PB and EB may be loaded in hardware registers
|
||||
wider than 16 bits, if available.
|
||||
EM implementations can also make efficient use of a machine
|
||||
with separate instruction and data space.
|
||||
.P
|
||||
EM with 32 bit pointers allows one to make use of machines
|
||||
with large address spaces.
|
||||
In a virtual, segmented memory system one could use a separate
|
||||
segment for each fragment.
|
||||
Reference in New Issue
Block a user