3

私はこれらすべてに不慣れで、基本を100%正しく理解したいので、辛抱強く答えてください. 私は機械エンジニアなので、厳しくしないでください。私はいくつかの非常に基本的な低レベルのものについて学んでおり、コンパイラのバックエンドに関連する概念を理解することに興味がありました. C/C++ コンパイラの出力は、おそらくコンピューター アーキテクチャ用に特別に調整されたマシン コードです。これは、Windows と Linux が同じハードウェア (i7 プロセッサなど) で実行されている場合、Windows と Linux で同じであることも意味します。しかし、バイナリ形式の形式には別のレイヤーがあります。つまり、Linux には ELF ( Executable and Linkable Format ) があり、Windows には PE/COFF ( Portable Executable ) があります。

したがって、Linux と Windows のコンパイラには、動作が異なり、バイナリを ELF または PE/COFF 形式で出力するバックエンドがあると思います。

ReactOSは Windows のクローンであり、Windows とある程度のバイナリ互換性があります。

ELF を理解して適切にロードする LOADER を ReactOS に持つことは理論的に可能ですか?

Linux API を ReactOS API にマッピングするソフトウェアのレイヤーが必要であることは理解しています。そのようなマッピング レイヤーが存在する場合、私の質問は理にかなっていますか?

4

1 に答える 1

4

ローダーが足りない。

オペレーティング システムには、独自のシステム コール インターフェイスがあります。Linux と Windows のバイナリ API についてはあまり詳しくありません。前回システム コールを直接使用したのは MS-DOS でした。

MS-DOS では、関数コードを AH レジスタにロードして INT 21H を呼び出すことにより、DOS 関数を呼び出すことができます。レジスタ AL は、サブ関数またはプライマリ パラメータとしてよく使用されます。たとえば、プログラムを終了する方法を思い出すことができます。

    MOV AX,4C01H   ; funciton AH = $4C (exit), error code is AH = 1
    INT 21H
; program gets never here

そのため、他のオペレーティング システムは他のファッション インターフェイスを提供します。たとえば、AmigaDOS は exec.library のアドレスを絶対アドレス 4 (そう、$00000004) に持っており、ライブラリ関数は、ライブラリの「ベース」アドレス (-4、-8 など) への負のオフセットにあるジャンプ テーブルを介してアクセスできます。他のライブラリのポインタは、open 関数を使用して、exec.library から問い合わせることができます。

MS-DOS と AmigaDOS は異なるアーキテクチャで実行されますが、オペレーティング システムの呼び出しがどのように異なるかを示す良い例です。ソフトウェア割り込みと最初のライブラリによって提供されるライブラリ アドレス。

時々、違いは運です。異なるオペレーティング システムの呼び出しが干渉しない場合は、エイリアン オペレーティング システムの呼び出しを受け取り、それらをホスト オペレーティング システムに変換するラッパーを作成することができます。オペレーティング システムの API がシステム コールのパラメータの順序だけが異なる場合は完璧ですが、状況はより困難です。より単純な関数は他の OS のフレーバーにマップできますが、より複雑な関数 - コールバックを使用! - 難しいです。ラッパーは、機能だけでなく、オペレーティング システムのバグもエミュレートする場合があります。

とにかく、このジャンルには良いものがあります。

良い例はCygWinで、Win32 で Linux プログラムを実行できます。最後に使用したとき、スレッドやネットワークなどを使用しても、コマンドラインの実行に問題はありませんでした。編集済み: @fortran が言うように、再コンパイルとライブラリが必要です。

Linux の場合、WINEは Win32 アプリを実行するための優れた取り組みです。WINE を使用する商用ソフトウェアの公式 Linux バージョンさえあります。プログラムが最新の Windows API 呼び出しを利用していない場合、WINE は機能するはずです。

Linux と BSD はどちらも POSIX 互換のオペレーティング システムであるため、BSD 用のLinux 互換性レイヤーのようなものが存在することは驚くことではありません。

于 2013-02-04T14:22:36.600 に答える