Системные вызовы в Linux

Я нашел направления для компиляции XFreeRDP в их Wiki GitHub. Это, казалось бы, было бы тем, что Вы ищете.

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

2
16.07.2014, 17:15
1 ответ

В большинстве случаев выбранный вами язык предоставляет функции (своего рода), которые в конечном итоге отображаются на соответствующие системные вызовы . В таких случаях просто используйте их и покончите с этим; вообще не нужно рассматривать интерфейсы системных вызовов. Фактически, я бы сказал, что если вы не пишете стандартную библиотеку, в первую очередь не должно быть необходимости рассматривать детали более низкого уровня. Это не похоже на дни оригинального IBM PC, где прямой доступ к структурам памяти мог резко повысить производительность (и даже тогда это было признано неоптимальным решением, поскольку оно сильно ограничивало переносимость).

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

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

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

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

2
27.01.2020, 22:13

Теги

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