Реализуй простейшую аппаратную трансляцию адреса base-and-bounds (она же
динамическое перемещение).
Процесс работает с виртуальными адресами, которые начинаются с нуля. Железо на
лету превращает виртуальный адрес в физический: прибавляет к нему base
(где в физической памяти лежит начало процесса) и проверяет по bound
(размер области), что обращение не вышло за пределы процесса.
Функция Translate(va, base, bound int) (int, bool) должна:
- если
0 <= va < bound — вернуть (base + va, true): физический адрес и
признак успеха;
- иначе — вернуть
(0, false): обращение вне границ, железо ловит нарушение
(segmentation fault).
Translate(100, 32768, 16384)
// → 32868, true (100 в пределах bound, физический = 32768+100)
Translate(16384, 32768, 16384)
// → 0, false (va == bound — это уже за пределами, индексы 0..16383)
Translate(-5, 32768, 16384)
// → 0, false (отрицательный виртуальный адрес недопустим)
Краевые условия: va == 0 при bound > 0 — корректно (это самый первый байт
процесса); va == bound — уже вне границ; любой отрицательный va — ошибка.
Подробный разбор механики — в главе
«Трансляция адресов».