2013-04-30 3 views
0

Давайте рассмотрим простую программу на языке С, скомпилированную в Windows.Независимость от машины

Я могу скомпилировать программу на процессоре Intel и запустить ее на процессоре AMD (одна и та же операционная система). Значит ли это, что набор команд для CPU одинаковый?

Почему одна и та же программа не работает на компьютере с разной ОС и тем же процессором?

ответ

2

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

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

Если вы пишете простую программу типа "main() {printf (" Hello \ n "), возвращаете 0; Работает на том же процессоре, не помогает, так как он может выполнять инструкции по сборке, но оно не будет ужасно, как только вызов первой функции ОС

Для разработки этого немного:.

Подобно тому, как exmaple Предположим, что мы работаем на Amiga OS с процессором Motorola 68000.

Если я правильно помню, вызывающие вызовы для вызова sys tem библиотеки включала загрузку указателей в адресный регистр ЦП и затем вызов функции ОС.

Теперь позвольте предположить, что я пишу свою собственную ОС также с использованием процессора Motorola 68000. Однако, когда я разрабатываю свою ОС, я думал, что гораздо лучше использовать стек для обмена данными, поэтому, когда вы вызываете аналогичную функцию в моей собственной частной ОС, вы не передаете адрес в регистре адресов, вместо этого вы нажимаете его на стек. Теперь, когда ваш исполняемый файл будет выполнен в моей ОС (предположим, что он может быть загружен, потому что я использую одну и ту же структуру объекта), ваш исполняемый файл будет помещать значения в регистр, и моя ОС попытается вытолкнуть их из стека, потому что это не знайте, что ценности, которые он искал, должны были быть другими.

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

+0

Пожалуйста, объясните простыми словами. заранее спасибо –

+0

Отредактировал текст с примером, чтобы проиллюстрировать, что я имею в виду. – Devolus

+0

oh nice illustration..hy вы знаете какую-нибудь хорошую книгу, чтобы узнать, как компьютер работает прямо с машинного уровня (цифровая логика)? –

2

Как ваш Intel, так и AMD используют архитектуру x86 (или x86-64). Вот почему вы можете запускать одно и то же программное обеспечение на обоих. Однако скомпилированная программа содержит больше, чем просто зависимости от архитектуры, она также содержит зависимости от базовой операционной системы. Даже двоичный формат исполняемого файла Linux отличается от Windows.

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

Johan.

+0

Спасибо. как портирование достигается во время выполнения? –

+0

Что значит «во время выполнения»? Если вы подразумеваете под этим то, что совместимость достигается во время выполнения (пример вина на Linux - хороший пример), это означает, что кто-то написал обертку, которая знает, как загружать исполняемые файлы, а затем перехватывает вызовы из двоичного кода и переводит их в базовую ОС. В противном случае невозможно выполнить перенос исполняемого файла во время выполнения. Вам всегда нужен слой эмуляции. – Devolus

+0

Порт @ShankarNShankar во время выполнения может быть снят только в том случае, если ОС имеет большой кусок кода, который способен читать и выполнять ** внешний ** исполняемый файл. В настоящее время это виртуальная машина ** (VM). Меня можно отключить без виртуальной машины на некоторых платформах, где две платформы подобны достаточно, чтобы полная VM не требовалась. ** Wine **, который запускает Windows x86 на Linux x86 или Mac x86, является одним из примеров. –

Смежные вопросы