Linuxではx86アセンブラを作成して画面に文字を印刷できますか(標準出力)?いいえどのシステムコールが使用されますか?
x86アセンブリでは入出力ジョブに特権が付与されており、CPUがRING 0でなければジョブを実行できないため、これは可能ではないと思います。
答え1
はい、いいえ。
はい - そうです。オペレーティングシステムは、ユーザープロセスがデバイス(この場合はビデオ)に直接アクセスするのを防ぎます。
いいえ - アプリケーションをRing Zeroに送信できます。たとえば、カーネルにモジュールとして提供します。もちろん、標準のユーザーレベルのアプリケーションではありませんが、可能です。
答え2
現代のオペレーティングシステムの焦点は、ファイルシステム、パイプ、端末などの有用な抽象化だけでなく、ユーザープロセス間のメモリ保護と分離を提供することです。それらのいくつかは、プロセス間の仲介者として機能し、これらの抽象ルールを強制することです。したがって、ユーザープロセスがプロセス外のエントリと対話するたびに、ほとんど常にオペレーティングシステムを通過する必要があり、システムコールがデフォルトの方法です。
今、いくつかの解決策があります。たとえば、共有メモリマッピングを使用すると、オペレーティングシステムコードを使用せずにプロセス間でデータを転送できます。カーネルでさえ、実際にカーネルコードを呼び出さずにいくつかの単純なシステムコールの実装を提供しますが(AFAIK)、これは読み取り専用です。たとえば、参照してください。Linuxユーティリティが現在時刻を取得するためにシステムコールを使用しないのはなぜですか?
問題は、システムコールを介して実行される共有マッピングを設定することです(驚くべきことではありません)。プログラムファイルを実行するとメモリマップが破壊されるため、通常のスタンドアロンプログラムではこれを実行できません。 1つのコードスニペットで設定を実行し、共有マップを介してのみ対話する別のコードスニペットを呼び出すだけです。 2番目の部分は別のライブラリファイルからロードできますが、それが重要かどうかはわかりません。