как сделать виртуальный компьютер в компьютере

Что такое виртуальная машина

В статье мы расскажем, что называется виртуальной машиной и для чего она предназначена, разберём преимущества и недостатки использования виртуальных машин, кратко рассмотрим 4 виртуальные машины и установим VirtualBox.

Что такое виртуальная машина и зачем она нужна

Виртуальная машина (ВМ или VM) — это виртуальный компьютер, который использует выделенные ресурсы реального компьютера (процессор, диск, адаптер). Эти ресурсы хранятся в облаке и позволяют ВМ работать автономно. Простыми словами, виртуальная машина позволяет создать на одном компьютере ещё один компьютер, который будет использовать его ресурсы, но работать изолированно.

ВМ может работать в отдельном окне как программа или запускаться через панель управления.

2d chto takoe virtualnaja mashina 1 240120

Виртуализация, и виртуальная машина в частности, расширяет возможности 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 и нажмите Создать:

20201015 chto takoe virtualnaya mashina 1

Введите название виртуальной машины (например, Ubuntu-1). Кликните Далее:

20201015 chto takoe virtualnaya mashina 2

Чтобы выделить объём памяти для машины, сдвиньте ползунок вправо. Мы рекомендуем указать объём 4 ГБ, но если на вашем компьютере недостаточно оперативной памяти, выбирайте максимум 2-3 ГБ. Нажмите Далее:

20201015 chto takoe virtualnaya mashina 3

Выберите пункт «Создать новый виртуальный жёсткий диск» и кликните Создать:

20201015 chto takoe virtualnaya mashina 4

Укажите тип файла «VDI (VirtualBox Disk Image)» и нажмите Далее:

20201015 chto takoe virtualnaya mashina 5

Выберите формат хранения «Динамический виртуальный жёсткий диск». Нажмите Далее:

20201015 chto takoe virtualnaya mashina 6

Укажите объём жёсткого диска 20 ГБ. Кликните Создать:

20201015 chto takoe virtualnaya mashina 7

Готово, вы создали VM Oracle. Теперь переходите к установке операционной системы.

20201015 chto takoe virtualnaya mashina 8

Как установить операционную систему в Oracle VirtualBox

Рассмотрим, как установить операционную систему на примере Ubuntu 20.04.

Перейдите в раздел Система. На вкладке «Материнская плата» поставьте галочку напротив пункта «Гибкий диск»:

20201015 chto takoe virtualnaya mashina 9

На вкладке «Процессор» выберите 2 ядра:

20201015 chto takoe virtualnaya mashina 11

Перейдите в раздел Дисплей. Поставьте галочку напротив пункта «Включить 3D-ускорение» и перетяните ползунок вправо, чтобы выделить максимально возможный объём видеопамяти:

20201015 chto takoe virtualnaya mashina 10

После загрузки кликните Ок:

20201015 chto takoe virtualnaya mashina 12

На главной странице нажмите Запустить:

20201015 chto takoe virtualnaya mashina 13

Подождите, пока загрузится машина:

20201015 chto takoe virtualnaya mashina 14

В приветственном окне выберите нужный язык:

20201015 chto takoe virtualnaya mashina 15

Нажмите установить Ubuntu:

20201015 chto takoe virtualnaya mashina 16

Выберите раскладку клавиатуры «Russian». Нажмите Продолжить:

20201015 chto takoe virtualnaya mashina 17

Выберите пункты «Обычная установка» и «Загрузить обновления во время установки Ubuntu». Затем кликните Продолжить:

20201015 chto takoe virtualnaya mashina 18

Выберите тип установки «Стереть диск и установить Ubuntu» и нажмите Установить:

20201015 chto takoe virtualnaya mashina 19

Затем кликните Продолжить:

20201015 chto takoe virtualnaya mashina 20

Назначьте нужный регион и нажмите Продолжить:

20201015 chto takoe virtualnaya mashina 21

Зарегистрируйтесь. Задайте имя и пароль, остальные поля будут заполнены автоматически. Нажмите Продолжить:

20201015 chto takoe virtualnaya mashina 22

Дождитесь окончания установки и кликните Перезагрузить:

20201015 chto takoe virtualnaya mashina 23

Дождитесь перезагрузки и нажмите Enter:

20201015 chto takoe virtualnaya mashina 24

Выберите учётную запись, которую вы создали на шаге 15:

20201015 chto takoe virtualnaya mashina 25

Введите пароль, который вы задали при создании учётной записи:

20201015 chto takoe virtualnaya mashina 26

Примите предлагаемые настройки или нажмите Далее в правом верхнем углу экрана:

20201015 chto takoe virtualnaya mashina 27

Готово, вы установили ОС Ubuntu 20.04 и можете приступать к работе:

chto takoe virtualnaja mashina 161020 1

Теперь вы знаете, зачем нужна виртуальная машина и как запустить её с помощью программы 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 и нажмите Создать:

20201015 2d chto takoe virtualnaya mashina 1

3. Введите название виртуальной машины (имя может быть любое). Кликните Далее:

20201015 2d chto takoe virtualnaya mashina 2

4. Укажите объём памяти для машины. Для этого сдвиньте ползунок вправо. Нажмите Далее:

20201015 2d chto takoe virtualnaya mashina 3

5. Выберите пункт «Создать новый виртуальный жёсткий диск» и кликните Создать:

20201015 2d chto takoe virtualnaya mashina 4

6. Укажите тип файла «VDI (VirtualBox Disk Image)» и нажмите Далее:

20201015 2d chto takoe virtualnaya mashina 5

7. Выберите формат хранения «Динамический виртуальный жёсткий диск». Нажмите Далее:

20201015 2d chto takoe virtualnaya mashina 6

8. Укажите объём жёсткого диска 20 ГБ. Кликните Создать:

20201015 2d chto takoe virtualnaya mashina 7

Готово, вы создали ВМ на VirtualBox. Теперь переходите к установке операционной системы:

20201015 2d chto takoe virtualnaya mashina 8

Как установить операционную систему в VirtualBox

Рассмотрим, как установить операционную систему на примере Ubuntu 20.04.

Скачайте дистрибутив Ubuntu на компьютер.

Откройте панель управления Oracle и нажмите Настроить:

20201015 2d chto takoe virtualnaya mashina 122

3. Перейдите в раздел Система. На вкладке «Материнская плата» поставьте галочку напротив пункта «Гибкий диск»:

20201015 2d chto takoe virtualnaya mashina 9

4. На вкладке «Процессор» выберите 2 ядра:

20201015 2d chto takoe virtualnaya mashina 11

5. Перейдите в раздел Дисплей. Поставьте галочку напротив пункта «Включить 3D-ускорение» и передвиньте ползунок вправо, чтобы выделить максимально возможный объём видеопамяти:

20201015 2d chto takoe virtualnaya mashina 10

6. Перейдите в раздел Носители и выберите «Пусто». Затем нажмите на иконку ДискВыбрать образ оптического диска. Загрузите дистрибутив Ubuntu, который вы скачали на первом шаге.

7. После загрузки кликните Ок:

20201015 chto takoe virtualnaya mashina 12

8. На главной странице нажмите Запустить:

20201015 chto takoe virtualnaya mashina 13

9. Подождите, пока загрузится машина:

20201015 2d chto takoe virtualnaya mashina 14

10. В приветственном окне выберите язык:

20201015 2d chto takoe virtualnaya mashina 15

11. Нажмите установить Ubuntu:

20201015 2d chto takoe virtualnaya mashina 16

12. Выберите раскладку клавиатуры «Russian». Нажмите Продолжить:

20201015 2d chto takoe virtualnaya mashina 17

13. Выберите пункты «Обычная установка» и «Загрузить обновления во время установки Ubuntu». Затем кликните Продолжить:

20201015 2d chto takoe virtualnaya mashina 18

14. Выберите тип установки «Стереть диск и установить Ubuntu» и нажмите Установить:
20201015 2d chto takoe virtualnaya mashina 19

Затем кликните Продолжить:

20201015 2d chto takoe virtualnaya mashina 20

15. Назначьте нужный регион и нажмите Продолжить:

16. Зарегистрируйтесь. Задайте имя и пароль, остальные поля будут заполнены автоматически. Нажмите Продолжить:

20201015 2d chto takoe virtualnaya mashina 22

17. Дождитесь окончания установки и кликните Перезагрузить:

18. Дождитесь перезагрузки и нажмите Enter:

20201015 2d chto takoe virtualnaya mashina 24

19. Выберите учётную запись, которую вы создали на шаге 15:

20201015 2d chto takoe virtualnaya mashina 25

20. Введите пароль, который вы задали при создании учётной записи:

20201015 2d chto takoe virtualnaya mashina 26

21. Примите предлагаемые настройки или нажмите Далее в правом верхнем углу экрана:

20201015 2d chto takoe virtualnaya mashina 27

Готово, вы установили ОС Ubuntu 20.04 и можете приступать к работе:

20201015 2d chto takoe virtualnaya mashina 29

Теперь вы знаете, что делает виртуальная машина и какими ресурсами виртуальной машины можно управлять с помощью программы VirtualBox.

Источник

Пишем собственную виртуальную машину

В этом руководстве я расскажу, как написать собственную виртуальную машину (VM), способную запускать программы на ассемблере, такие как 2048 (моего друга) или Roguelike (моя). Если вы умеете программировать, но хотите лучше понять, что происходит внутри компьютера и как работают языки программирования, то этот проект для вас. Написание собственной виртуальной машины может показаться немного страшным, но я обещаю, что тема удивительно простая и поучительная.

Окончательный код составляет около 250 строк на C. Достаточно знать лишь основы C или C++, такие как двоичная арифметика. Для сборки и запуска подходит любая Unix-система (включая macOS). Несколько API Unix используются для настройки ввода и отображения консоли, но они не являются существенными для основного кода. (Реализация поддержки Windows приветствуется).

Примечание: эта VM — грамотная программа. То есть вы прямо сейчас уже читаете её исходный код! Каждый фрагмент кода будет показан и подробно объяснён, так что можете быть уверены: ничего не упущено. Окончательный код создан сплетением блоков кода. Репозиторий проекта тут.

1. Оглавление

2. Введение

Что такое виртуальная машина?

Виртуальная машина — это программа, которая действует как компьютер. Она имитирует процессор с несколькими другими аппаратными компонентами, позволяя выполнять арифметику, считывать из памяти и записывать туда, а также взаимодействовать с устройствами ввода-вывода, словно настоящий физический компьютер. Самое главное, VM понимает машинный язык, который вы можете использовать для программирования.

Сколько аппаратного обеспечения имитирует конкретная VM — зависит от её предназначения. Некоторые VM воспроизводят поведение одного конкретного компьютера. У людей больше нет NES, но мы всё ещё можем играть в игры для NES, имитируя аппаратное обеспечение на программном уровне. Эти эмуляторы должны точно воссоздать каждую деталь и каждый основной аппаратный компонент оригинального устройства.

Другие VM не соответствуют никакому конкретному компьютеру, а частично соответствуют сразу нескольким! В первую очередь это делается для облегчения разработки ПО. Представьте, что вы хотите создать программу, работающую на нескольких компьютерных архитектурах. Виртуальная машина даёт стандартную платформу, которая обеспечивает переносимость. Не нужно переписывать программу на разных диалектах ассемблера для каждой архитектуры. Достаточно сделать только небольшую VM на каждом языке. После этого любую программу можно написать лишь единожды на языке ассемблера виртуальной машины.

image loader

image loader

Примечание: компилятор решает подобные проблемы, компилируя стандартный высокоуровневый язык для разных процессорных архитектур. 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

image loader

Наша 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-разрядных инструкций, называется машинным кодом и фактически выполняется виртуальной машиной.

image loader

Примечание: хотя компилятор и ассемблер играют схожую роль в разработке, они не одинаковы. Ассемблер просто кодирует то, что программист написал в тексте, заменяя символы их двоичным представлением и упаковывая их в инструкции.

Циклы и условия выполняются с помощью goto-подобной инструкции. Вот еще один пример, который считает до 10.

Примечание: для этого руководства необязательно учиться ассемблеру. Но если вам интересно, можете написать и собрать собственные программы LC-3 с помощью LC-3 Tools.

5. Выполнение программ

Ещё раз, предыдущие примеры просто дают представление, что делает VM. Для написания VM вам не нужно полное понимание ассемблера. Пока вы следуете соответствующей процедуре чтения и исполнения инструкций, любая программа LC-3 будет корректно работать, независимо от её сложности. В теории, VM может запустить даже браузер или операционную систему, как Linux!

Если глубоко задуматься, то это философски замечательная идея. Сами программы могут производить сколь угодно сложные действия, которые мы никогда не ожидали и, возможно, не сможем понять. Но в то же время вся их функциональность ограничивается простым кодом, который мы напишем! Мы одновременно знаем всё и ничего о том, как работает каждая программа. Тьюринг упоминал эту чудесную идею:

«Мнение о том, что машины не могут чем-либо удивить человека, основывается, как я полагаю, на одном заблуждении, которому в особенности подвержены математики и философы. Я имею в виду предположение о том, что коль скоро какой-то факт стал достоянием разума, тотчас же достоянием разума становятся все следствия из этого факта». — Алан М. Тьюринг

Процедура

Вот точное описание процедуры, которую нужно написать:

Начнём изучение этого процесса на примере основного цикла:

6. Реализация инструкций

Теперь ваша задача — сделать правильную реализацию для каждого опкода. Подробная спецификация каждой инструкции содержится в документации проекта. Из спецификации нужно узнать, как работает каждая инструкция, и написать реализацию. Это проще, чем кажется. Здесь я продемонстрирую, как реализовать две из них. Код для остальных можно найти в следующем разделе.

Инструкция ADD берёт два числа, складывает их и сохраняет результат в регистре. Спецификация в документации на стр. 526. Каждая инструкция ADD выглядит следующим образом:

image loader

Таким образом, мы знаем, где сохранить результат, и знаем первое число для сложения. Осталось только узнать второе число для сложения. Здесь две строки начинают различаться. Обратите внимание, что вверху 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.

Вот как выглядит двоичная компоновка:

image loader

Это может показаться окольным путём для чтения из памяти, но так нужно. Инструкция LD ограничена адресным смещением 9 бит, тогда как память требует для адреса 16 бит. LDI полезна для загрузки значений, которые хранятся где-то за пределами текущего компьютера, но для их использования адрес конечного местоположения должен храниться рядом. Вы можете думать о ней как о локальной переменной в C, которая является указателем на некоторые данные:

Как и раньше, после записи значения в DR следует обновить флаги:

Коды условий задаются в зависимости от того, является ли результат отрицательным, нулевым или положительным. (стр. 532)

Вот код для данного случая: ( mem_read обсудим в следующем разделе):

7. Шпаргалка по инструкциям

В этом разделе — полные реализации оставшихся инструкций, если вы застряли.

Источник

Поделиться с друзьями
DOMA35.RU