
リンカー(コンパイル後のリンクを行う)やローダー(実行ファイルを実行する)の存在は、Linux などの OS に依存しないのでしょうか?(Linux のリンカーとローダーは、他のアプリケーション プログラムと同様に、OS またはソフトウェアによって提供されるものだと思っていましたが、今では非常に特殊で異なるものだと思っています。インストールされている OS に関係なく、同じである可能性があります。)
リンカーとローダーはマシン言語、つまり ISA レベルに存在しますか? (そのレベルでは OS はありません) それともアセンブリ言語レベルですか?
プログラミングソフトウェアの観点から、OS をプログラミングライブラリ (ライブラリ) と考えるのは正しいでしょうか?
ありがとう。
リンカーとローダーをコンピュータ システムのレベル/レイヤーのどこに配置すればよいかを知りたいです。
コンピュータ システムのレイヤー/レベルについては、Nisan の「The Elements of Computer Systems」を参照してください。
リンクと読み込みについては、コンピュータシステム: プログラマーの視点
答え1
リンカー(コンパイル後のリンクを行うもの)やローダー(実行ファイルを実行するもの)の存在は、Linux などの OS に依存しないのでしょうか?(Linux のリンカーとローダーは、他のアプリケーション プログラムと同様に、OS またはソフトウェアによって提供されるものだと思っていましたが、今では非常に特殊で異なるものだと思っています。)
リンカーとローダーは、他のアプリケーションと同様に特定の目的を持っています。これらは静的プログラムの構築や動的プログラムの構築とロードに重要ですが、これらは「通常の」アプリケーション(ランタイムローダーの場合はライブラリ)です。つまりこれらは複雑ではありますが、オペレーティング システムからの特別なサポートに依存していないと言えます。
これにより、あるオペレーティングシステム用のプログラムを別のオペレーティングシステムにリンクすることが可能になります(例えばLinux上でWindowsプログラムを構築したり、その逆を行ったり、あるシステム用に構築された動的リンクプログラムを別のシステムでロードしたりします(Wineを参照)。オペレーティングシステムに求められる主な要件は、新しい実行可能コンテンツをロードする方法を提供することです(つまり実行中のプログラムが実行可能メモリを自身に追加できるようにする)、およびプログラムの要件を満たすために仮想アドレス空間を十分に制御できるようにする(特に、実行可能ファイルとライブラリをロードするためのベース アドレス)。
リンカーとローダーはマシン言語、つまり ISA レベルに存在しますか? (そのレベルでは OS はありません) それともアセンブリ言語レベルですか?
これらの質問の原因はよく分かりませんが、リンカーはシンボルとアドレスを操作します。リンカーは、インポートおよびエクスポートされたシンボルのテーブルと、リンカーによって計算された値が入力される再配置エントリを含むオブジェクト ファイルを操作します。
OS をプログラミングライブラリ (ライブラリ) として考えるのは正しいでしょうか?
それは非常に制限的です。オペレーティング システムは、その上で実行されるアプリケーションにいくつかのサービスを提供しますが、非常に単純なオペレーティング システム (8 ビット マイクロ、MS-DOS など) の場合でも、それ以上のことを行います。たとえば、ハードウェア割り込みを処理したり、プロセスをスケジュールしたり (マルチタスク システムの場合)、アクセス許可を制御したり (アクセス制御を備えたマルチユーザー システムの場合) します...
あなたが言及している図は、コンピュータ アーキテクチャを理解する方法というよりも、本の地図として役立つという印象を受けます。