Системный вызов для другой аппаратной архитектуры?

Я предполагаю, что код будет написан на C.

Я изучил, что компилятор выполняет код (лексический анализ, синтаксический анализ и т. Д.) И преобразует наш код в код сборки, а затем ассемблер собирает код в машинный код, который, наконец, выполняется на Аппаратном обеспечении. Поэтому я сомневаюсь, что код, который написан для системных вызовов, переносится, т.е. если я скомпилирую тот же код на каком-то оборудовании, будет ли этот код работать?

Правильно ли я говорю, что единственная часть, зависящая от архитектуры, - это компилятор, и системные вызовы, скомпилированные на других архитектурах, будут работать нормально?


person Community    schedule 07.12.2012    source источник
comment
@Blachshma Пожалуйста, снимите с меня запрет .. Мне нужен еще один шанс!   -  person    schedule 10.12.2012


Ответы (2)


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

например, системные вызовы sbrk и brk, которые используются для malloc (), т.е. распределение динамической памяти недоступно в Windows.

Узнайте, как malloc реализован в Windows Вопросы о распределении памяти Windows

Доступны два типа системных вызовов, а именно: «независимая от архитектуры машины» и «зависит от архитектуры машины».

Если вы используете только машинную архитектуру, независимую от архитектуры, то при переносе особых проблем не возникнет.

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

person Jeyaram    schedule 07.12.2012
comment
Спасибо за ответ. Но, как вы сказали, есть 2 типа системных вызовов, независимых и зависимых. Если я вызываю архитектурно-независимый вызов, зачем мне перекомпилировать? - person ; 07.12.2012
comment
Код необходимо перекомпилировать независимо от того, используете ли вы одни и те же системные вызовы или нет, потому что разные архитектуры имеют разные наборы инструкций. - person szx; 07.12.2012
comment
@szx Я согласен с вами, что в каждой архитектуре будут разные наборы инструкций. Значит ли это, что компилятор будет генерировать архитектурно-зависимый код или задача ассемблера - генерировать машинно-зависимый код? - person ; 07.12.2012
comment
malloc() не является системным вызовом. malloc() - это просто стандартизованная функция в библиотеке C, что совсем другое дело, и она сделана так, чтобы не зависеть от платформы. - person Linuxios; 07.12.2012

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

  • Старая версия x86: int
  • Intel новее x86 / 64: _2 _ / _ 3_
  • AMD x86 / 64: _4 _ / _ 5_
  • ARM: swi 0x420000

Очевидно, что ни один из них не совместим. Таким образом, хотя большая часть сборки x86 будет работать на старом x86, более новом Intel x86 / 64 и AMD x86 / 64, системные вызовы разные. Даже если вы используете абстракции, такие как Linux VDSO, он все равно сильно зависит от архитектуры относительно того, где находится VDSO.

Для обычных вызовов функций это гораздо больше связано с соглашениями о вызовах, которые различаются в зависимости от архитектуры из-за различий стека и регистров.

Другими словами, почти ни один ассемблерный код не является когда-либо кросс-архитектурным.

person Linuxios    schedule 07.12.2012