Можно ли собрать загрузочную NetBSD на OSX?

Вам всегда нужно нацеливать на платформу. В простейшем случае целевой ЦП напрямую запускает код, скомпилированный в двоичном формате (это примерно соответствует исполняемым файлам COM MS DOS). Давайте рассмотрим две разные платформы, которые я только что придумал - Armistice и Intellio. В обоих случаях у нас будет простая программа hello world, выводящая на экран 42. Я также предполагаю, что вы используете многоплатформенный язык, не зависящий от платформы, поэтому исходный код одинаков для обоих:

Print(42)

В Armistice у вас есть простой драйвер устройства, который заботится о печати чисел , поэтому все, что вам нужно сделать, это вывести в порт. На нашем переносимом ассемблере это будет соответствовать примерно так:

out 1234h, 42

Однако или в системе Intellio такой вещи нет, поэтому она должна проходить через другие уровни:

mov a, 10h
mov c, 42
int 13h

Ой, у нас уже есть существенная разница между двумя , еще до того, как мы перейдем к машинному коду! Это примерно соответствует разнице между Linux и MS DOS или IBM PC и X-Box (даже если оба могут использовать один и тот же процессор).

Но это то, для чего нужны ОС. Предположим, у нас есть HAL, который гарантирует, что все различные аппаратные конфигурации обрабатываются одинаково на уровне приложения - в основном, мы будем использовать подход Intellio даже в Armistice, и наш код «переносимой сборки» будет таким же. Это используется как современными Unix-подобными системами, так и Windows, часто даже во встроенных сценариях. Хорошо - теперь у нас может быть один и тот же действительно переносимый ассемблерный код как для Armistice, так и для Intellio.Но как насчет двоичных файлов?

Как мы и предполагали, ЦП должен выполнять двоичные файлы напрямую. Давайте посмотрим на первую строку нашего кода, mov a, 10h , в Intellio:

20 10

Ой. Оказывается, mov a, constant настолько популярен, что у него есть собственная инструкция со своим собственным кодом операции. Как с этим справляется «Перемирие»?

36 01 00 10

Хмм. Есть код операции для mov.reg.imm , поэтому нам нужен еще один аргумент для выбора регистра, которому мы назначаем. А константа всегда представляет собой 2-байтовое слово в нотации с прямым порядком байтов - именно так было спроектировано Armistice, на самом деле, все инструкции в Armistice имеют длину 4 байта, без исключений.

А теперь представьте, что вы запускаете двоичный файл из Intellio в режиме перемирия: ЦП начинает декодирование инструкции, находит код операции 20h . По перемирию это соответствует, скажем, инструкциям и.imm.reg . Он пытается прочитать 2-байтовую константу слова (которая читает 10XX , уже проблема), а затем номер регистра (еще один XX ). Мы выполняем неправильную инструкцию с неправильными аргументами. И что еще хуже, следующая инструкция будет полной подделкой, потому что мы на самом деле съели другую инструкцию, думая, что это данные.

У приложения нет шансов на работу, и, скорее всего, оно выйдет из строя или почти сразу же зависнет.

Это не означает, что исполняемый файл всегда должен сообщать, что он работает на Intellio или Armistice. Вам просто нужно определить платформу, которая не зависит от ЦП (например, bash в Unix) или как ЦП, так и ОС (например, Java или .NET, а в настоящее время даже вроде JavaScript).В этом случае приложение может использовать один исполняемый файл для всех различных ЦП и ОС, в то время как в целевой системе есть какое-то приложение или служба (которая напрямую нацелена на правильный ЦП и / или ОС), которая переводит независимый от платформы код во что-то ЦП действительно может выполнять. Это может или не может повлиять на производительность, стоимость или возможности.

Процессоры обычно бывают семействами. Например, все процессоры из семейства x86 имеют общий набор инструкций, которые закодированы точно таким же образом, поэтому каждый процессор x86 может запускать любую программу x86, если он не пытается использовать какие-либо расширения (например, операции с плавающей запятой или векторные операции). На x86 наиболее распространенными сегодня примерами являются, конечно же, Intel и AMD. Atmel - известная компания, разрабатывающая процессоры семейства ARM, довольно популярных для встраиваемых устройств. Например, у Apple также есть собственные процессоры ARM.

Но ARM совершенно несовместима с x86 - у них очень разные требования к дизайну и очень мало общего. Инструкции имеют совершенно разные коды операций, они декодируются по-разному, адреса памяти обрабатываются по-разному ... Возможно, можно создать двоичный файл, который будет работать как на процессоре x86, так и на процессоре ARM, используя некоторые безопасные операции для различать эти два и переходить к двум совершенно разным наборам инструкций, но это по-прежнему означает, что у вас есть отдельные инструкции для обеих версий, с помощью только загрузчика, который выбирает правильный набор во время выполнения.

2
08.01.2016, 23:14
0 ответов

Теги

Похожие вопросы