Files
AwesomePolytech/OSs/lab-virt-win/README.md
2025-10-10 00:20:58 +03:00

6.9 KiB
Raw Blame History

Виртуальная память

Прошу обратить внимание на файлики report.txt и vm.bin. report.txt - место, куда будут сгружаться отчеты потока-монитора, vm.bin - файл, где находится программа для потока-симулятора. Подробнее про его команды можно почитать в методичке. Также прикладывается скрипт на питоне для генерации программ, его описание приложу, когда напишу

Как запускать

Лаба требует файлов report.txt и vm.bin, и как вы их создадите в общем-то не важно. vm.bin я создавал через SIMASM. report создастся сам. Компилируете лабу любым нормальным для вас способом, она в терминальчик выдаст порядок своих действий. Там 2 потока, один делает вид, что работает с памятью и исполняет команды из vm.bin. Он будет писать какую команду исполнил и успешно ли. Второй поток - монитор, он раз в какое-то время (можно отрегулировать в сорцах) пишет отчетики в report.txt. Там он пишет статистику по занятой памяти, страничному файлу и подобному. Для его более удобного чтения есть скрипт util.py. Он тоже написан за 5 минут, поэтому для него важно, чтобы файл назывался именно report.txt, она помимо свободных страниц выведет еще и процентовку и немного другой инфы, в общем читать это поудобнее будет.

На выходе сейчас у вас должно получиться что запрашивается сколько-то памяти, потом пишется отчет, потом с памятью заигрывается, пишется новый отчет, потом память освобождается и пишется 3 отчет. на самом деле их будет 5 (все будут в одном файле), но это потому что с таймингами особо не угадаешь

В общем-то о том, что происходит в рамках отчета и надо будет рассказать на лабе

Касаемо кода сложно что-то хорошее сказать, только скажу, что не прям все я протестировал, так что если будете заигрывать с чем-то кроме аллокаций и освобождений, то там бог знает что выйдет

SIMASM

Простой скрипт, фактически просто пачка регулярок, которые из человекочитаемого текста собирают бинарь, который надо по условию задачи

Каждая команда состоит из 5 частей и заканчивается точкой с запятой. Не все команды используют все части, но так как писать нормальный парсер мне лень, а simasm был написан за 10 минут, чтобы я во время тестов по 10 раз байты руками не перекладывал, он требует все поля. Теперь по каждому полю отдельно:

  1. Поле, задающее минимальное время от начала процесса, которое должно пройти, прежде чем команда исполнится. Должно указываться в десятичных цифрах и может заканчиваться на 2 суффикса (ms - миллисекунды, s - секунды)
  2. Поле, указывающее адрес региона, над которым будет производиться махинация. регион не должен быть слишком маленьким, потому что первые 64 КБ виртуальной памяти зарезервированы операционкой
  3. Команда. Почти полностью соответствуют командам из методички:
    • exit - выходит из программы, но фактически не используется
    • reserve_region - резервирует какое-то количество памяти (указывается в 4 параметре), отдает страницы, но фактически еще память из системы не забирает. Чтобы ее забрать надо что-то со страницами поделать. Для этого есть mess_region
    • pass_block - резервирует регион с MEM_COMMIT, не знаю, зачем это надо, но это единственное сходное в методичке что есть
    • non_save_block - аллоцирует страницы, изменения на которых не пойдут на старничный файл
    • free_region - освобождает занятые страницы
    • lock_block - блокирует страницы и препятствует их попаданию в swap
    • unlock_block - разблокирует страницы и разрешает им уходить в swap
    • mess_region - выполняет тупые операции чтения или записи с блоком, чтобы ось его на самом деле выдала, а не просто сказала, что сделала это
  4. Размер области или региона в памяти. Доступны суффиксы Gb - гигабайты, Mb - мегабайты, kb - килобайты
  5. Параметр записи - что разрешается делать со страницами r - только читать, rw - читать и писать, rwe - читать, писать и исполнять, re - читать и исполнять, e - только исполнять

если подать флаг -f FILE - будет читать из указанного файла команды, иначе будет читать из стандартного потока ввода, если подать -o OUTPUT - запишет бинарный вывод в файл, в противном случае выдаст хексы в стандартный вывод