Преобразование кодов операций ОС
Я не могу загрузить Windows 3.1 (кстати, на самом деле я не имею в виду загрузку Windows 3.1, это просто пример, поэтому не приспосабливайте свой ответ конкретно к тому, как загрузить Windows 3.1) непосредственно на моем оборудовании, потому что машина код, написанный/скомпилированный/собранный для ЦП в то время, отличается от кодов операций, которые есть у моего ЦП.
Поэтому единственный вариант — эмулировать процессор, для которого предназначалась система.
Однако, если бы я хотел в полной мере воспользоваться преимуществами своей системы (например, использовать всю оперативную память для этой ОС), то это бы не сработало. Тогда я бы предпочел запустить его на голом железе. Но что, если он не поддерживает мою систему?
Не знаю, есть ли это еще вещь, но есть ли такое понятие, как "компилятор, но для операционки"? Это мой вопрос.
Что касается разъяснений и подробностей, то, что я имею в виду под «компилятором, но ОС» — это программное обеспечение, которое принимает машинный код операционной системы, а также аппаратную информацию о том, для чего предназначена операционная система , и аппаратную информацию компьютера. то есть собирается загрузить его и разумно создать новый машинный код операционной системы, за исключением того, что вы можете загрузить его изначально на своем оборудовании/процессоре (очевидно, что необходимо внести большие изменения и дополнения в исходный код, именно поэтому я упомянул об этом будучи «умным», как компилятор G++). Другими словами, если обычная виртуальная машина интерпретирует коды операций ОС и запускает эквивалентные коды операций хост-машины, то то, что я описываю, просто «предварительно интерпретирует это.
1 ответ
есть ли такое понятие как "компилятор, но для операционки"?
Если все, что у вас есть, это «машинный код операционной системы», то я предполагаю, что вы имеете в виду исполняемый файл двоичный образ ядра.
Теоретически машинный код одного ЦП можно преобразовать в машинный код ЦП другой архитектуры. Но для этого обычно требуется дизассемблирование (то есть обратный перевод машинного кода) исполняемого файла на язык ассемблера. Дизассемблирование облегчает обработку адресов (памяти) для ветвей, вызовов и переменных за счет использования символических меток (вместо числовых адресов памяти, используемых в машинном коде).
Дизассемблирование исполняемого бинарного образа затруднено необходимостью отличать данные от кода. Организация или расположение таких двоичных файлов зависит от машины и компилятора.
Даже если вам удастся перевести машинный код на другую машину, вы все равно застрянете с процедурами реализации кода для исходной системы. Исполняемый бинарный образ ядра содержит управляющие последовательности, написанные специально для определенного типа оборудования. В этом коде содержатся шаги по контролю и доступу к этому оборудованию, например к конкретному периферийному устройству. Автоматического перевода или преобразования таких процедур для какой-либо другой аппаратной системы не существует. Слишком много нюансов по адаптации кода ядра под другую машину/архитектуру, поэтому это нужно делать вручную.
В настоящее время не существует механизма, который бы "разумно создавал новый машинный код" для тебя.
Приложение
И что место, откуда они получают эти инструкции, - с диска.
ЦП (обычного цифрового компьютера) извлекает (следующую) инструкцию из места, указанного в регистре счетчика программ (он же указатель инструкций). Это место будет адресом памяти.
Инструкции извлекаются из (основной) памяти, а не "с накопителя".
См. Запуск компьютера без оперативной памяти?
Моя идея состоит в том, чтобы перевести весь код заранее, а не в реальном времени, как это делают программы виртуализации.
[Похоже, вы путаете виртуализацию и эмуляцию. Изучите различия. См. https://stackoverflow.com/questions/6044978/full-emulation-vs-full-virtualization.]
Эмуляция выполняет фактический путь выполнения через исполняемый файл. Исполняемый образ всегда будет иметь начальный адрес, т. е. местоположение первой инструкции (в машинном коде), которую необходимо выполнить. Доступ к последовательным ячейкам осуществляется для последующих инструкций, если только не «выполнена» команда перехода, вызова или возврата или не обработано прерывание.
При выполнении (собственном или эмуляционном ЦП) образ удобно идентифицирует местоположения, содержащие инструкции и данные. Доступ к локациям будет осуществляться как инструкции по мере их выполнения. Доступ к данным будет осуществляться при обращении к операнду инструкции или косвенно через регистр.
Но эмуляция, скорее всего, будет только «выполнять»; часть мест всего исполняемого образа. Будет много мест, на которые никогда не будут ссылаться или к которым не будет доступа, и, следовательно, не будет точно известно, что это место, содержащее инструкцию или данные. Задача определения использования каждого местоположения может быть утомительной и сложной.
Есть ли гарантия отсутствия самомодифицирующегося кода?
Есть ли какие-либо гарантии, что в коде не смешаны скрытые данные или наоборот?
Трансляция кода операции в другой набор команд обычно выполняется напрямую. Но идентификация каждой инструкции по данным в исполняемом образе не всегда может быть выполнена надежно, особенно если инструкции имеют переменную длину (например, инструкции Intel x86).
Перевод набора команд — это лишь первая проблема перевода исполняемого образа. Трансляция набора команд представляет собой только замену процессора. Помимо ЦП находятся системная шина(и) и периферийные устройства. Как будет «переведен» код? выполнять разные процедуры для этой другой системы?
Если исполняемый файл был программой пользовательского пространства для данной ОС, то сведения об оборудовании абстрагируются ОС. Такой исполняемый файл будет иметь минимальные аппаратные зависимости, кроме ЦП, а процесс преобразования значительно упрощается.
Но поскольку вы указали, что исполняемым файлом является операционная система (которую я интерпретирую как ядро), то это код, который должен реализовать эту аппаратную абстракцию. Такой исполняемый файл будет иметь множество аппаратных зависимостей, помимо ЦП, и процесс преобразования будет очень сложным.