Linux には安定したシステムコール ABI がありますが、Windows では Win32 ABI が安定しており、すぐにカーネル空間に入らないようにします。 nt.dllなどのWindowsの下位機能は、WindowsのアップデートまたはWindowsのバージョン間で変更される可能性があります。
FreeBSDカーネルやMachなどの他のカーネルについて知りたいです。安定したシステムコールを提供しますか、それともPOSIXインターフェイスに信頼できるABIのみを提供しますか?
答え1
通常、答えは次のようになります。いいえ、オペレーティングシステムの開発者は互換性の問題のために友好的かもしれません。しかし、それに頼ってはいけません。
FreeBSD
いいえ。
アップグレードプロセスとソースコードの変更ができるだけ中断されないようにしていますが、あるバージョンから次のメジャーバージョンへのAPIとABIの互換性は保証されていません。
https://wiki.freebsd.org/VendorInformation
オープンBSD
いいえ、承認されていないシステムコールはlibc
強制的に禁止されています。
私はいくつかの方法でexecve()を直接呼び出すのを難しくしました。カーネルへの入力は、libcシステムコールスタブ内の正確なシステムコールコマンドを介して行う必要があります。このシステムコール命令の前に、SYS_execve命令がレジスタにロードされます。一部のアーキテクチャでは、PLT接続可能スタブがさまざまな方法でトリガーできるretguardチェックを実行します。スタックピボットは、他の検査によってほとんどブロックされます。 SYS_syscall(システムコールレジスタ= 0)を介したエントリもできません。
https://marc.info/?l=openbsd-tech&m=169841790407370&w=2
システムコールソースチェックの導入2019年末から。
ネットワークBSD
いいえ。
このシステムコールは、Cライブラリにエントリがない新しいシステムコールをテストするのに役立ちます。通常のアプリケーションでは使用しないでください。
https://man.netbsd.org/syscall.2
アップルシステム
いいえ、そのようなことがあります。その前に休む時間。
AppleはMac OS Xで静的にリンクされたバイナリをサポートしていません。静的接続バイナリはカーネルシステムコールインターフェイスでバイナリ互換性を想定していますが、これは保証されません。代わりに、動的にリンクされたすべてのシステムライブラリとフレームワークのバイナリ互換性を確保するよう努めています。
https://developer.apple.com/library/archive/qa/qa1118/_index.html
回答エスキモーインAppleの従業員は、これがまだ真実であることを確認しました。
Appleツールは静的ライブラリをサポートしていますが、実行可能ファイル全体の静的リンクはサポートしていません[1]。
libSystem
カーネルにアクセスするには、すべてのプログラムをシステムフレームワーク(別名)に接続する必要があります。 Appleは、このレイヤに対するバイナリ互換性のみを保証します。静的にリンクされた実行可能ファイルはシステムコールを直接実行する必要があり、ここではバイナリ互換性を保証しません。
https://developer.apple.com/forums/thread/706419
ソラリスとイルモス
いいえ。
正式にサポートされている唯一のシステム呼び出し方法であるSolarisとIllumosも、Cライブラリを介しています。
https://utcc.utoronto.ca/~cks/space/blog/programming/GoCLibraryAPIIssues
より権威のある情報源として、この2010年の電子メールは手動システムコールがサポートされていないことを明示的に示しています。
Andrew、システムコール番号を維持またはリサイクルする実際の「正式な」方法はありません
。システムコール番号は、文書化されていない/コミットされていないインターフェイスです。
私たちはサードパーティのシステムコールをサポートしておらず、サポートしたこともありません。 ISVは必要に応じて自分で行動し、コミットされていないインターフェイスを使用しており、カーネルパッチを介して
破損が発生する可能性があることを直視する必要があります。システムコールテーブルの内容が
変更された場合、第三者には通知されません。これは安定したインターフェイスではありません。
https://www.cs.cmu.edu/afs/gco/archive/pipermail/port-solaris/2010-November/000009.html
AIX
ありません。 AIX のシステム呼び出し層に関する情報が見つかりません。syscall
ここではサポートされていません(間接システムコール)。システム・コールは、AIX で動的に拡張されているようです。
トピック:XView 3.0を使用したRS / 6000のシステムコール
syscall文字列を検索してすべての情報を見るように、infoの情報を読みました。ただし、私が見た情報の一部は、IBMの外部では使用できない可能性があります。これは私が見つけたものを再入力したものです。正しいと保証することはできません。
---------- 10/02/91 AIXと同等のSUNシステムコールルーチンが必要です。
プロジェクト番号:Q557045
...問題:
SUNで実行されているアプリケーションを移植しようとしています。
プログラムの1つは、「syscall」というルーチンを使用して、低レベルの
読み取り、書き込み、およびfnctl操作を実行します。
このタスクを実行するためにRS / 6000で何を使用できますか?この機能や同等の機能がない場合は、
広範な回避策を作成する必要があります。A:RS / 600には、「syscall」システムコール機能を
複製するために使用できるルーチンはありません。
「syscall」システムコールは、
BSDの間接システムコールです。つまり、最初のパラメーターは
カーネルが実行する必要がある別のシステム呼び出しを表し、
後続のパラメーターは別の呼び出しに渡されます。
システムコール番号は
libcのCラッパーに隠されず、ユーザーレベルで表示されるため、これは本質的に移植できません。システム・コール
番号はsyscall.hで定義されています(
このファイルはAIX V3には含まれていません)。 [カーネルは動的に拡張でき、拡張されるため]
この呼び出しを使用するコードを移植するには、どの呼び出しが行われるかを理解し、システム呼び出しの独自のバージョンを作成する必要があります。これはデフォルトで
最初の引数のスイッチ文で構成され、
正しい番号で適切なシステムコールを呼び出します。買収の。
実行されるシステムコールによっては、varagrs.h(stdarg.h)を適切に使用する必要があるかもしれません。
http://www.verycomputer.com/176_244b08fbb92e184f_1.htm
ld
また、バージョン間で静的リンクが互換性がないという警告も表示されます。
メモ: 次のいずれかを使用して[
noautoimp
またはnso
]フラグを使用すると、共有オブジェクトファイルをアプリケーションに静的にリンクできます。静的にリンクされたアプリケーションは、すべての修正またはリリースレベルから他の修正またはリリースレベルにバイナリ移植可能ではありません。
https://www.ibm.com/docs/en/aix/7.3?topic=l-ld-command
また見なさい:https://blog.firetree.net/2005/07/21/static-linking-on-aix/