99 lines
4.0 KiB
Markdown
99 lines
4.0 KiB
Markdown
|
|
||
|
This program allows you to see how address translations are performed in a
|
||
|
system with base and bounds registers. As before, there are two steps to
|
||
|
running the program to test out your understanding of base and bounds. First,
|
||
|
run without the -c flag to generate a set of translations and see if you can
|
||
|
correctly perform the address translations yourself. Then, when done, run with
|
||
|
the -c flag to check your answers.
|
||
|
|
||
|
In this homework, we will assume a slightly different address space than our
|
||
|
canonical one with a heap and stack at opposite ends of the space. Rather, we
|
||
|
will assume that the address space has a code section, then a fixed-sized
|
||
|
(small) stack, and a heap that grows downward right after, looking something
|
||
|
like you see in the Figure below. In this configuration, there is only one
|
||
|
direction of growth, towards higher regions of the address space.
|
||
|
|
||
|
-------------- 0KB
|
||
|
| Code |
|
||
|
-------------- 2KB
|
||
|
| Stack |
|
||
|
-------------- 4KB
|
||
|
| Heap |
|
||
|
| | |
|
||
|
| v |
|
||
|
-------------- 7KB
|
||
|
| (free) |
|
||
|
| ... |
|
||
|
|
||
|
In the figure, the bounds register would be set to 7~KB, as that represents
|
||
|
the end of the address space. References to any address within the bounds
|
||
|
would be considered legal; references above this value are out of bounds and
|
||
|
thus the hardware would raise an exception.
|
||
|
|
||
|
To run with the default flags, type relocation.py at the command line. The
|
||
|
result should be something like this:
|
||
|
|
||
|
prompt> ./relocation.py
|
||
|
...
|
||
|
Base-and-Bounds register information:
|
||
|
|
||
|
Base : 0x00003082 (decimal 12418)
|
||
|
Limit : 472
|
||
|
|
||
|
Virtual Address Trace
|
||
|
VA 0: 0x01ae (decimal:430) -> PA or violation?
|
||
|
VA 1: 0x0109 (decimal:265) -> PA or violation?
|
||
|
VA 2: 0x020b (decimal:523) -> PA or violation?
|
||
|
VA 3: 0x019e (decimal:414) -> PA or violation?
|
||
|
VA 4: 0x0322 (decimal:802) -> PA or violation?
|
||
|
|
||
|
For each virtual address, either write down the physical address it
|
||
|
translates to OR write down that it is an out-of-bounds address
|
||
|
(a segmentation violation). For this problem, you should assume a
|
||
|
simple virtual address space of a given size.
|
||
|
|
||
|
As you can see, the homework simply generates randomized virtual
|
||
|
addresses. For each, you should determine whether it is in bounds, and if so,
|
||
|
determine to which physical address it translates. Running with -c (the
|
||
|
"compute this for me" flag) gives us the results of these translations, i.e.,
|
||
|
whether they are valid or not, and if valid, the resulting physical
|
||
|
addresses. For convenience, all numbers are given both in hex and decimal.
|
||
|
|
||
|
prompt> ./relocation.py -c
|
||
|
...
|
||
|
Virtual Address Trace
|
||
|
VA 0: 0x01ae (decimal:430) -> VALID: 0x00003230 (dec:12848)
|
||
|
VA 1: 0x0109 (decimal:265) -> VALID: 0x0000318b (dec:12683)
|
||
|
VA 2: 0x020b (decimal:523) -> SEGMENTATION VIOLATION
|
||
|
VA 3: 0x019e (decimal:414) -> VALID: 0x00003220 (dec:12832)
|
||
|
VA 4: 0x0322 (decimal:802) -> SEGMENTATION VIOLATION
|
||
|
]
|
||
|
|
||
|
With a base address of 12418 (decimal), address 430 is within bounds (i.e., it
|
||
|
is less than the limit register of 472) and thus translates to 430 added to
|
||
|
12418 or 12848. A few of the addresses shown above are out of bounds (523,
|
||
|
802), as they are in excess of the bounds. Pretty simple, no? Indeed, that is
|
||
|
one of the beauties of base and bounds: it's so darn simple!
|
||
|
|
||
|
There are a few flags you can use to control what's going on better:
|
||
|
|
||
|
prompt> ./relocation.py -h
|
||
|
Usage: relocation.py [options]
|
||
|
|
||
|
Options:
|
||
|
-h, --help show this help message and exit
|
||
|
-s SEED, --seed=SEED the random seed
|
||
|
-a ASIZE, --asize=ASIZE address space size (e.g., 16, 64k, 32m)
|
||
|
-p PSIZE, --physmem=PSIZE physical memory size (e.g., 16, 64k)
|
||
|
-n NUM, --addresses=NUM # of virtual addresses to generate
|
||
|
-b BASE, --b=BASE value of base register
|
||
|
-l LIMIT, --l=LIMIT value of limit register
|
||
|
-c, --compute compute answers for me
|
||
|
]
|
||
|
|
||
|
In particular, you can control the virtual address-space size (-a), the size
|
||
|
of physical memory (-p), the number of virtual addresses to generate (-n), and
|
||
|
the values of the base and bounds registers for this process (-b and -l,
|
||
|
respectively).
|
||
|
|