Simulator
The program relocation.py
allows you to see how address translations are performed in a system with base and bounds registers. See the README for details.
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).
Questions
-
Run with seeds 1, 2, and 3, and compute whether each virtual address generated by the process is in or out of bounds. If in bounds, compute the translation.
-
Run with these flags:
-s 0 -n 10
. What value do you have set-l
(the bounds register) to in order to ensure that all the generated virtual addresses are within bounds? -
Run with these flags:
-s 1 -n 10 -l 100
. What is the maximum value that base can be set to, such that the address space still fits into physical memory in its entirety? -
Run some of the same problems above, but with larger address spaces (
-a
) and physical memories (-p
). -
What fraction of randomly-generated virtual addresses are valid, as a function of the value of the bounds register? Make a graph from running with different random seeds, with limit values ranging from 0 up to the maximum size of the address space.
Get hands-on with 1400+ tech skills courses.