- Что такое виртуальная машина
- Что такое виртуальная машина и зачем она нужна
- Какие бывают виртуальные машины
- Как создать виртуальную машину Oracle VirtualBox
- Как установить операционную систему в Oracle VirtualBox
- Виртуальный дата-центр VMware
- Что такое виртуальная машина и как её создать
- Что такое виртуальная машина
- Зачем нужна виртуальная машина и виртуализация
- Преимущества и недостатки использования виртуальной машины
- Популярные виртуальные машины
- VMware
- VirtualBox
- Microsoft Hyper-V
- Parallels Desktop
- Как создать виртуальную машину VirtualBox
- Как установить операционную систему в VirtualBox
- Пишем собственную виртуальную машину
- 1. Оглавление
- 2. Введение
- Что такое виртуальная машина?
- 3. Архитектура LC-3
- Память
- Регистры
- Набор инструкций
- Флаги условий
- 4. Примеры на ассемблере
- 5. Выполнение программ
- Процедура
- 6. Реализация инструкций
- 7. Шпаргалка по инструкциям
Что такое виртуальная машина
В статье мы расскажем, что называется виртуальной машиной и для чего она предназначена, разберём преимущества и недостатки использования виртуальных машин, кратко рассмотрим 4 виртуальные машины и установим VirtualBox.
Что такое виртуальная машина и зачем она нужна
Виртуальная машина (ВМ или VM) — это виртуальный компьютер, который использует выделенные ресурсы реального компьютера (процессор, диск, адаптер). Эти ресурсы хранятся в облаке и позволяют ВМ работать автономно. Простыми словами, виртуальная машина позволяет создать на одном компьютере ещё один компьютер, который будет использовать его ресурсы, но работать изолированно.
ВМ может работать в отдельном окне как программа или запускаться через панель управления.
Виртуализация, и виртуальная машина в частности, расширяет возможности IT-инфраструктуры. Она будет полезна разработчикам программных продуктов, веб-дизайнерам, а также тем, кто планирует перейти на новую ОС, но не уверен в выборе.
Для чего нужна виртуальная машина:
Если сравнивать функции виртуальной машины с работой на обычном ПК, то можно выделить как преимущества, так и недостатки.
Преимущества виртуальной машины
Недостатки использования VM
Ниже мы расскажем про самые популярные и простые в использовании виртуальные машины и разберём их недостатки и преимущества.
Какие бывают виртуальные машины
К самым популярным виртуальным машинам относятся:
Microsoft Hyper-V ― это VM от Майкрософт.
Плюсы | Минусы |
---|---|
Привычный интерфейс для пользователей Microsoft | Не запускается с версий ниже Windows 10 |
Сразу установлена на Windows 10 (Pro, Enterprise, и Education) | Нельзя установить на MacOS |
Поддерживает различные старые версии Windows | Интерфейс уступает VMWare и VirtualBox |
VMware Workstation ― платная мощная виртуальная машина для профессионального использования. Работает в основном с Windows и Linux. Имеет бесплатную версию VMware Player, но она значительно ограничена функционалом.
Плюсы | Минусы |
---|---|
Установка систем по шаблону | Платная VM |
Удобный интерфейс | Нельзя записать видео с экрана виртуальной машины |
Высокая стабильность и надёжность | |
Детальная настройка оборудования. Можно отдельно настроить ID процессора, количество видеопамяти и др. | |
Поддержка 3D-графики и DirectX 10 | |
Поддерживает EFI |
Parallels Desktop ― это ВМ, которая позволяет использовать программы разных операционных систем на Mac.
Плюсы | Минусы |
---|---|
Работает без перегрузок | Платная программа |
Поддерживает различные операционные системы (Windows, Linux, разные версии MacOS и другие ОС) | Работает только на MacOS |
VirtualBox ― cамая популярная программа виртуализации с открытым исходным кодом. С её помощью можно запускать любые операционные системы, например Windows, Linux, Mac, Android. Программа имеет русифицированный интерфейс и проста в применении.
Плюсы | Минусы |
---|---|
Бесплатная VM | Нельзя выделить машине больше, чем 256 МБ видеопамяти. Для современных систем этого мало |
Имеет русскоязычную версию | Не поддерживается DirectX для 3D-графики |
Интуитивно понятный интерфейс, подходит новичкам | |
Можно управлять через GUI (графический пользовательский интерфейс) и командную строку | |
Есть комплект SDK | |
Можно подключать USB-устройства к виртуальным компьютерам, чтобы работать с ними напрямую | |
Поддерживает протокол RDP (протокол удалённого доступа) |
Все машины имеют свои сильные и слабые стороны. Нельзя рекомендовать только одну. Для примера мы рассмотрим, как создать виртуальную машину Oracle VirtualBox.
Как создать виртуальную машину Oracle VirtualBox
Откройте панель управления Oracle и нажмите Создать:
Введите название виртуальной машины (например, Ubuntu-1). Кликните Далее:
Чтобы выделить объём памяти для машины, сдвиньте ползунок вправо. Мы рекомендуем указать объём 4 ГБ, но если на вашем компьютере недостаточно оперативной памяти, выбирайте максимум 2-3 ГБ. Нажмите Далее:
Выберите пункт «Создать новый виртуальный жёсткий диск» и кликните Создать:
Укажите тип файла «VDI (VirtualBox Disk Image)» и нажмите Далее:
Выберите формат хранения «Динамический виртуальный жёсткий диск». Нажмите Далее:
Укажите объём жёсткого диска 20 ГБ. Кликните Создать:
Готово, вы создали VM Oracle. Теперь переходите к установке операционной системы.
Как установить операционную систему в Oracle VirtualBox
Рассмотрим, как установить операционную систему на примере Ubuntu 20.04.
Перейдите в раздел Система. На вкладке «Материнская плата» поставьте галочку напротив пункта «Гибкий диск»:
На вкладке «Процессор» выберите 2 ядра:
Перейдите в раздел Дисплей. Поставьте галочку напротив пункта «Включить 3D-ускорение» и перетяните ползунок вправо, чтобы выделить максимально возможный объём видеопамяти:
После загрузки кликните Ок:
На главной странице нажмите Запустить:
Подождите, пока загрузится машина:
В приветственном окне выберите нужный язык:
Нажмите установить Ubuntu:
Выберите раскладку клавиатуры «Russian». Нажмите Продолжить:
Выберите пункты «Обычная установка» и «Загрузить обновления во время установки Ubuntu». Затем кликните Продолжить:
Выберите тип установки «Стереть диск и установить Ubuntu» и нажмите Установить:
Затем кликните Продолжить:
Назначьте нужный регион и нажмите Продолжить:
Зарегистрируйтесь. Задайте имя и пароль, остальные поля будут заполнены автоматически. Нажмите Продолжить:
Дождитесь окончания установки и кликните Перезагрузить:
Дождитесь перезагрузки и нажмите Enter:
Выберите учётную запись, которую вы создали на шаге 15:
Введите пароль, который вы задали при создании учётной записи:
Примите предлагаемые настройки или нажмите Далее в правом верхнем углу экрана:
Готово, вы установили ОС Ubuntu 20.04 и можете приступать к работе:
Теперь вы знаете, зачем нужна виртуальная машина и как запустить её с помощью программы VirtualBox.
Виртуальный дата-центр VMware
Кроме VM, есть более крупные решения ― виртуальные дата-центры. Например, виртуальный дата-центр VMware, который можно заказать в REG.RU.
Для чего используют виртуальный дата-центр?
Эта услуга подходит для применения как частными лицами, так и крупными организациями и корпорациями. Возможности виртуализации в совокупности с облачными вычислениями обладают такими преимуществами как масштабируемость, экономичность и доступность ресурсов в любое время. Можно создавать и развёртывать несколько ВМ одновременно. К примеру, вы можете создать один виртуальный контейнер vApp с машинами для тестовой среды, а другой — для продуктивной. При этом у вас будет возможность изолировать их с помощью разных сетей. Подробнее об услуге читайте в статье: Как начать работу с VMware.
Что такое виртуальная машина и как её создать
В этой статье мы расскажем, что называется виртуальной машиной и для чего предназначена эта программа, а также покажем, как устанавливать VirtualBox.
Виртуальные машины с каждым годом все больше набирают популярность. Такой рост объясняется двумя основными причинами:
Что такое виртуальная машина
Иногда требуется установить программу, созданную для ОС, которой нет на устройстве. Для этого можно воспользоваться технологией виртуализации. Виртуализация ― это возможность запуска нескольких операционных систем на одном физическом устройстве. То есть виртуальная машина позволяет создать на одном компьютере ещё один компьютер. Технология использует ресурсы устройства (память, процессор, устройство ввода и вывода), но при этом работает как отдельный компьютер.
Операционная система, на базе которой создаётся новая среда, называется хост-системой (host), а дополнительная операционная система — гостевой.
Виртуализация создается при помощи двух элементов: виртуальной машины и гипервизора.
Виртуальная машина (ВМ или VM) — программа, с помощью которой можно создать гостевую операционную систему на компьютере.
Гипервизор — программа, которая управляет физическими ресурсами вычислительной машины и распределяет эти ресурсы между несколькими различными операционными системами, позволяя запускать их одновременно. Благодаря гипервизору операционные системы не мешают друг другу.
Есть три вида гипервизоров:
Аппаратный. Такие гипервизоры используют Hyper-V, KVM, ESXi. Xen. Аппаратный гипервизор устанавливается прямо на «железо» и выполняет функции эмуляции физического аппаратного обеспечения. То есть такой гипервизор является минимальной операционной системой.
Хостовый гипервизор запускается на обычной ОС, как и другие приложения в системе. В этом случае гостевая ОС выполняется как процесс на хосте, а гипервизор разделяет гостевую ОС и ОС хоста. Примеры гипервизоров этого типа: VMware, VirtualBox и Parallels Desktop для macOS.
Гибридный. Смесь аппаратного и хостового гипервизора. Аппаратными средствами управляет первый тип гипервизора. Хостовый работает с остальными аппаратными компонентами. Такой вид управления имеет Hybrid, Type-1+.
Зачем нужна виртуальная машина и виртуализация
Для чего используют виртуализацию:
Преимущества и недостатки использования виртуальной машины
Сохранение текущего состояния машины. Если нужно выключить ПК или перейти к другой задаче, то машина сохранит все настройки. При следующей загрузке ВМ откроется в том состоянии, в котором находилась в момент выключения.
Создание снапшота при тестировании нестабильной программы. Если при тестировании софта произошла критическая ошибка, можно откатить ВМ до предыдущего состояния. По сравнению с основной системой, для виртуальной машины выделяется меньше места на дисковом пространстве, благодаря этому откат системы происходит быстрее.
Машину можно сохранять или дублировать как изолированную среду. Её можно будет запустить позднее или скопировать на другой ПК со всеми заданными конфигурациями.
Для переподключения на другую ОС не нужно перезагружать компьютер.
Для одновременного запуска на ВМ нескольких операционных систем, нужно иметь соответствующие аппаратные ресурсы.
ОС в виртуальных машинах работают медленнее. Несмотря на постоянное развитие ВМ, работа виртуальных ОС ниже традиционных.
Виртуальная платформа поддерживает не весь функционал устройства. Например, VMware поддерживает USB 3.0, контроллеры портов COM и LPT и приводы CD-ROM, но виртуализация видеоадаптеров и поддержка функций ускорения трехмерной графики пока малодоступны.
Популярные виртуальные машины
Самыми популярным виртуальным машинам являются:
VMware
VMware — одна из самых популярных виртуальных машин для крупных задач. VMware имеет 2 вида: Player (бесплатная версия) и Workstation (платная версия). Для macOS есть специальная версия VMware Fusion и VMware Fusion Pro.
VirtualBox
VirtualBox — простой и бесплатный инструмент для виртуализации от компании ORACLE. Можно установить самые популярные операционные системы (Windows, Linux-подобные ОС, FreeBSD, macOS). Также VirtualBox может работать с VM, которые были созданы в платной версии VMware Workstation.
Microsoft Hyper-V
Microsoft Hyper-V — VM для Windows 10. Не работает на других ОС.
Parallels Desktop
Несмотря на развитость всех программ для виртуализации, самым часто используемым инструментом является VirtualBox. Он нашел свое применение частными лицами и организациями. Далее мы рассмотрим, как создать VM и установить операционную систему в программе VirtualBox.
Как создать виртуальную машину VirtualBox
Скачайте и установите VirtualBox на компьютер.
Откройте панель управления Oracle и нажмите Создать:
3. Введите название виртуальной машины (имя может быть любое). Кликните Далее:
4. Укажите объём памяти для машины. Для этого сдвиньте ползунок вправо. Нажмите Далее:
5. Выберите пункт «Создать новый виртуальный жёсткий диск» и кликните Создать:
6. Укажите тип файла «VDI (VirtualBox Disk Image)» и нажмите Далее:
7. Выберите формат хранения «Динамический виртуальный жёсткий диск». Нажмите Далее:
8. Укажите объём жёсткого диска 20 ГБ. Кликните Создать:
Готово, вы создали ВМ на VirtualBox. Теперь переходите к установке операционной системы:
Как установить операционную систему в VirtualBox
Рассмотрим, как установить операционную систему на примере Ubuntu 20.04.
Скачайте дистрибутив Ubuntu на компьютер.
Откройте панель управления Oracle и нажмите Настроить:
3. Перейдите в раздел Система. На вкладке «Материнская плата» поставьте галочку напротив пункта «Гибкий диск»:
4. На вкладке «Процессор» выберите 2 ядра:
5. Перейдите в раздел Дисплей. Поставьте галочку напротив пункта «Включить 3D-ускорение» и передвиньте ползунок вправо, чтобы выделить максимально возможный объём видеопамяти:
6. Перейдите в раздел Носители и выберите «Пусто». Затем нажмите на иконку Диск — Выбрать образ оптического диска. Загрузите дистрибутив Ubuntu, который вы скачали на первом шаге.
7. После загрузки кликните Ок:
8. На главной странице нажмите Запустить:
9. Подождите, пока загрузится машина:
10. В приветственном окне выберите язык:
11. Нажмите установить Ubuntu:
12. Выберите раскладку клавиатуры «Russian». Нажмите Продолжить:
13. Выберите пункты «Обычная установка» и «Загрузить обновления во время установки Ubuntu». Затем кликните Продолжить:
14. Выберите тип установки «Стереть диск и установить Ubuntu» и нажмите Установить:
Затем кликните Продолжить:
15. Назначьте нужный регион и нажмите Продолжить:
16. Зарегистрируйтесь. Задайте имя и пароль, остальные поля будут заполнены автоматически. Нажмите Продолжить:
17. Дождитесь окончания установки и кликните Перезагрузить:
18. Дождитесь перезагрузки и нажмите Enter:
19. Выберите учётную запись, которую вы создали на шаге 15:
20. Введите пароль, который вы задали при создании учётной записи:
21. Примите предлагаемые настройки или нажмите Далее в правом верхнем углу экрана:
Готово, вы установили ОС Ubuntu 20.04 и можете приступать к работе:
Теперь вы знаете, что делает виртуальная машина и какими ресурсами виртуальной машины можно управлять с помощью программы VirtualBox.
Пишем собственную виртуальную машину
В этом руководстве я расскажу, как написать собственную виртуальную машину (VM), способную запускать программы на ассемблере, такие как 2048 (моего друга) или Roguelike (моя). Если вы умеете программировать, но хотите лучше понять, что происходит внутри компьютера и как работают языки программирования, то этот проект для вас. Написание собственной виртуальной машины может показаться немного страшным, но я обещаю, что тема удивительно простая и поучительная.
Окончательный код составляет около 250 строк на C. Достаточно знать лишь основы C или C++, такие как двоичная арифметика. Для сборки и запуска подходит любая Unix-система (включая macOS). Несколько API Unix используются для настройки ввода и отображения консоли, но они не являются существенными для основного кода. (Реализация поддержки Windows приветствуется).
Примечание: эта VM — грамотная программа. То есть вы прямо сейчас уже читаете её исходный код! Каждый фрагмент кода будет показан и подробно объяснён, так что можете быть уверены: ничего не упущено. Окончательный код создан сплетением блоков кода. Репозиторий проекта тут.
1. Оглавление
2. Введение
Что такое виртуальная машина?
Виртуальная машина — это программа, которая действует как компьютер. Она имитирует процессор с несколькими другими аппаратными компонентами, позволяя выполнять арифметику, считывать из памяти и записывать туда, а также взаимодействовать с устройствами ввода-вывода, словно настоящий физический компьютер. Самое главное, VM понимает машинный язык, который вы можете использовать для программирования.
Сколько аппаратного обеспечения имитирует конкретная VM — зависит от её предназначения. Некоторые VM воспроизводят поведение одного конкретного компьютера. У людей больше нет NES, но мы всё ещё можем играть в игры для NES, имитируя аппаратное обеспечение на программном уровне. Эти эмуляторы должны точно воссоздать каждую деталь и каждый основной аппаратный компонент оригинального устройства.
Другие VM не соответствуют никакому конкретному компьютеру, а частично соответствуют сразу нескольким! В первую очередь это делается для облегчения разработки ПО. Представьте, что вы хотите создать программу, работающую на нескольких компьютерных архитектурах. Виртуальная машина даёт стандартную платформу, которая обеспечивает переносимость. Не нужно переписывать программу на разных диалектах ассемблера для каждой архитектуры. Достаточно сделать только небольшую VM на каждом языке. После этого любую программу можно написать лишь единожды на языке ассемблера виртуальной машины.
Примечание: компилятор решает подобные проблемы, компилируя стандартный высокоуровневый язык для разных процессорных архитектур. VM создаёт одну стандартную архитектуру CPU, которая симулируется на различных аппаратных устройствах. Одно из преимуществ компилятора в том, что отсутствуют накладные расходы во время выполнения, как у VM. Хотя компиляторы хорошо работают, написание нового компилятора для нескольких платформ очень трудно, поэтому VM всё ещё полезны. В реальности на разных уровнях и VM, и компиляторы используются совместно.
Виртуальная машина Java (JVM) — очень успешный пример. Сама JVM относительно среднего размера, она достаточно мала для понимания программистом. Это позволяет писать код для тысяч разнообразных устройств, включая телефоны. После реализации JVM на новом устройстве любая написанная программа Java, Kotlin или Clojure может работать на нём без изменений. Единственными затратами будут только накладные расходы на саму VM и дальнейшее абстрагирование от машинного уровня. Обычно это довольно хороший компромисс.
VM не обязательно должна быть большой или вездесущной, чтобы обеспечить аналогичные преимущества. Старые видеоигры часто использовали небольшие VM для создания простых скриптовых систем.
VM также полезны для безопасной изоляции программ. Одно из применений — сборка мусора. Не существует тривиального способа реализовать автоматическую сборку мусора поверх C или C++, так как программа не может видеть собственный стек или переменные. Однако VM находится «вне» запущенной программы и может наблюдать все ссылки на ячейки памяти в стеке.
Ещё один пример такого поведения демонстрируют смарт-контракты Ethereum. Смарт-контракты — это небольшие программы, которые выполняются каждым узлом валидации в блокчейне. То есть операторы разрешают выполнение на своих машинах любых программ, написанных совершенно незнакомыми людьми, без какой-либо возможности изучить их заранее. Чтобы предотвратить вредоносные действия, они выполняются на VM, не имеющей доступа к файловой системе, сети, диску и т.д. Ethereum — также хороший пример переносимости. Благодаря VM можно писать смарт-контракты без учёта особенностей множества платформ.
3. Архитектура LC-3
Наша VM будет симулировать вымышленный компьютер под названием LC-3. Он популярен для обучения студентов ассемблеру. Здесь упрощённый набор команд по сравнению с x86, но сохраняются все основные концепции, которые используются в современных CPU.
Во-первых, нужно сымитировать необходимые аппаратные компоненты. Попытайтесь понять, что представляет собой каждый компонент, но не волнуйтесь, если не уверены, как он вписывается в общую картину. Начнём с создания файла на С. Каждый фрагмент кода из этого раздела следует поместить в глобальную область видимости этого файла.
Память
В компьютере LC-3 есть 65 536 ячеек памяти (2 16 ), каждая из которых содержит 16-разрядное значение. Это означает, что он может хранить всего 128 Кб — намного меньше, чем вы привыкли! В нашей программе эта память хранится в простом массиве:
Регистры
Регистр — это слот для хранения одного значения в CPU. Регистры подобны «верстаку» CPU. Чтобы он мог работать с каким-то фрагментом данных, тот должен находиться в одном из регистров. Но поскольку регистров всего несколько, в любой момент времени можно загрузить только минимальный объём данных. Программы обходят эту проблему, загружая значения из памяти в регистры, вычисляя значения в другие регистры, а затем сохраняя окончательные результаты обратно в память.
В компьютере LC-3 всего 10 регистров, каждый на 16 бит. Большинство из них —общего назначения, но некоторым назначены роли.
Как и память, будем хранить регистры в массиве:
Набор инструкций
Инструкция — это команда, которая говорит процессору выполнить какую-то фундаментальную задачу, например, сложить два числа. У инструкции есть опкод (код операции), указывающий тип выполняемой задачи, а также набор параметров, которые предоставляют входные данные для выполняемой задачи.
Каждый опкод представляет собой одну задачу, которую процессор «знает», как выполнить. В LC-3 всего 16 опкодов. Компьютер может вычислить только последовательность этих простых инструкций. Длина каждой инструкции 16 бит, а левые 4 бита хранят код операции. Остальные используются для хранения параметров.
Позже подробно обсудим, что делает каждая инструкция. На данный момент определите следующие опкоды. Удостоверьтесь, что сохраняют такой порядок, чтобы получать правильное значение enum:
Примечание: в архитектуре Intel x86 сотни инструкций, в то время как в других архитектурах, таких как ARM и LC-3, очень мало. Небольшие наборы инструкций называются RISC, а более крупные — CISC. Большие наборы инструкций, как правило, не предоставляют принципиально новых возможностей, но часто упрощают написание ассемблерного кода. Одна инструкция CISC может заменить несколько инструкций RISC. Однако процессоры CISC более сложны и дороги в проектировании и производстве. Это и другие компромиссы не позволяют назвать «оптимальный» дизайн.
Флаги условий
У каждого процессора множество флагов состояния для сигнализации о различных ситуациях. LC-3 использует только три флага условий, которые показывают знак предыдущего вычисления.
Мы закончили настройку аппаратных компонентов нашей виртуальной машины! После добавления стандартных включений (см. по ссылке выше) ваш файл должен выглядеть примерно так:
Здесь указаны ссылки на пронумерованные разделы статьи, откуда берутся соответствующие фрагменты кода. Полный листинг см. в рабочей программе — прим. пер.
4. Примеры на ассемблере
Теперь рассмотрим программу на ассемблере LC-3, чтобы получить представление, что фактически выполняет виртуальная машина. Вам не нужно знать, как программировать на ассемблере, или всё тут понимать. Просто постарайтесь получить общее представление, что происходит. Вот простой «Hello World»:
Как и в C, программа выполняет по одному оператору сверху вниз. Но в отличие от C, здесь нет вложенных областей <> или управляющих структур, таких как if или while ; только простой список операторов. Поэтому его гораздо легче выполнить.
Обратите внимание, что имена некоторых операторов соответствуют опкодам, которые мы определили ранее. Мы знаем, что в инструкциях по 16 бит, но каждая строка выглядит как будто с разным количеством символов. Как возможно такое несоответствие?
Это происходит потому что код, который мы читаем, написан на ассемблере — в удобочитаемой и доступной для записи форме обычным текстом. Инструмент, называемый ассемблером, преобразует каждую строку текста в 16-разрядную двоичную инструкцию, понятную виртуальной машине. Эта двоичная форма, которая по сути представляет собой массив 16-разрядных инструкций, называется машинным кодом и фактически выполняется виртуальной машиной.
Примечание: хотя компилятор и ассемблер играют схожую роль в разработке, они не одинаковы. Ассемблер просто кодирует то, что программист написал в тексте, заменяя символы их двоичным представлением и упаковывая их в инструкции.
Циклы и условия выполняются с помощью goto-подобной инструкции. Вот еще один пример, который считает до 10.
Примечание: для этого руководства необязательно учиться ассемблеру. Но если вам интересно, можете написать и собрать собственные программы LC-3 с помощью LC-3 Tools.
5. Выполнение программ
Ещё раз, предыдущие примеры просто дают представление, что делает VM. Для написания VM вам не нужно полное понимание ассемблера. Пока вы следуете соответствующей процедуре чтения и исполнения инструкций, любая программа LC-3 будет корректно работать, независимо от её сложности. В теории, VM может запустить даже браузер или операционную систему, как Linux!
Если глубоко задуматься, то это философски замечательная идея. Сами программы могут производить сколь угодно сложные действия, которые мы никогда не ожидали и, возможно, не сможем понять. Но в то же время вся их функциональность ограничивается простым кодом, который мы напишем! Мы одновременно знаем всё и ничего о том, как работает каждая программа. Тьюринг упоминал эту чудесную идею:
«Мнение о том, что машины не могут чем-либо удивить человека, основывается, как я полагаю, на одном заблуждении, которому в особенности подвержены математики и философы. Я имею в виду предположение о том, что коль скоро какой-то факт стал достоянием разума, тотчас же достоянием разума становятся все следствия из этого факта». — Алан М. Тьюринг
Процедура
Вот точное описание процедуры, которую нужно написать:
Начнём изучение этого процесса на примере основного цикла:
6. Реализация инструкций
Теперь ваша задача — сделать правильную реализацию для каждого опкода. Подробная спецификация каждой инструкции содержится в документации проекта. Из спецификации нужно узнать, как работает каждая инструкция, и написать реализацию. Это проще, чем кажется. Здесь я продемонстрирую, как реализовать две из них. Код для остальных можно найти в следующем разделе.
Инструкция ADD берёт два числа, складывает их и сохраняет результат в регистре. Спецификация в документации на стр. 526. Каждая инструкция ADD выглядит следующим образом:
Таким образом, мы знаем, где сохранить результат, и знаем первое число для сложения. Осталось только узнать второе число для сложения. Здесь две строки начинают различаться. Обратите внимание, что вверху 5-й бит равен 0, а внизу — 1. Этот бит соответствует или непосредственному режиму, или регистровому режиму. В регистровом режиме второе число хранится в регистре, как и первое. Оно отмечено как SR2 и содержится в битах со второго по нулевой. Биты 3 и 4 не используются. На ассемблере это будет написано так:
В непосредственном режиме вместо добавления содержимого регистра непосредственное значение внедряется в саму инструкцию. Это удобно, потому что программе не нужны дополнительные инструкции для загрузки этого числа в регистр из памяти. Вместо этого оно уже внутри инструкции, когда нам нужно. Компромисс в том, что там могут храниться только небольшие числа. Если быть точным, максимум 2 5 =32. Это наиболее полезно для увеличения счётчиков или значений. На ассемблере можно написать так:
Вот выдержка из спецификации:
Если бит [5] равен 0, то второй исходный операнд получают из SR2. Если бит [5] равен 1, то второй исходный операнд получают путём расширения значения imm5 до 16 бит. В обоих случаях второй исходный операнд добавляется к содержимому SR1, а результат сохраняется в DR. (стр. 526)
Примечание: если вас интересуют двоичные отрицательные числа, можете прочитать о дополнительном коде. Но это не существенно. Достаточно просто скопировать код выше и использовать его, когда спецификация говорит расширить значение.
В спецификации есть последнее предложение:
Коды условий задаются в зависимости от того, является ли результат отрицательным, нулевым или положительным. (стр. 526)
Ранее мы определили условие flags enum, а теперь пришло время использовать этих флаги. Каждый раз, когда значение записывается в регистр, нам нужно обновить флаги, чтобы указать его знак. Напишем функцию для повторного использования:
Теперь мы готовы написать код для ADD :
В этом разделе много информации, поэтому подведём итоги.
LDI означает «косвенную» или «непрямую» загрузку (load indirect). Эта инструкция используется для загрузки в регистр значения из места в памяти. Спецификация на стр. 532.
Вот как выглядит двоичная компоновка:
Это может показаться окольным путём для чтения из памяти, но так нужно. Инструкция LD ограничена адресным смещением 9 бит, тогда как память требует для адреса 16 бит. LDI полезна для загрузки значений, которые хранятся где-то за пределами текущего компьютера, но для их использования адрес конечного местоположения должен храниться рядом. Вы можете думать о ней как о локальной переменной в C, которая является указателем на некоторые данные:
Как и раньше, после записи значения в DR следует обновить флаги:
Коды условий задаются в зависимости от того, является ли результат отрицательным, нулевым или положительным. (стр. 532)
Вот код для данного случая: ( mem_read обсудим в следующем разделе):
7. Шпаргалка по инструкциям
В этом разделе — полные реализации оставшихся инструкций, если вы застряли.