Linux はプロセッサ周辺のハードウェアとどのように通信するのでしょうか?

Linux はプロセッサ周辺のハードウェアとどのように通信するのでしょうか?

私の質問は、管理そのものよりも、Unix/Linux 開発に関するものです。

これは管理者向けではなく、Unix/Linux の低レベルシステムプログラマー向けだと思います。カーネル開発を始めたり、Linux システム開発を理解したりするのに役立ちます。

Linux がハードウェア周辺機器やモジュールとどのようにやり取りするかを学習するには、ハードウェアに関するどのような情報が必要ですか。たとえば、バス アーキテクチャやコントローラとの通信方法などです。

また、現在ほとんどの環境では、Linux は仮想マシン上で実行されているということも言及しておきます。つまり、その下の OS から見えるものが、私が言いたいことです。

参考資料、またはそのことについてどのように学び始めればよいか教えてください。

私は基本的な x86 命令は知っていますが、私の質問はプロセッサ自体の周囲のメモリとバス コントローラ、つまり最新の並列プログラミング環境におけるプログラマ モデルに関するものです。

答え1

それがどのように機能するかは、アーキテクチャ/マシンによって大きく異なります。Linux (カーネル) は、起動時に利用可能なデバイスとその接続をマッピングするツリーを作成します (また、接続されたデバイスが表示されたり消えたりします)。情報の取得元は、基盤となるハードウェアによって異なります。

同じマシン上で実行されている他のオペレーティング システムでは、独自の方法でこれを行うことになりますが、移植性が非常に高いことを目的としている場合は、おそらく同様のアプローチが使用されます。

例えば、オリジナルのPC(またはエミュレーション)をいじくり回すと、さまざまなものにアクセスできるようになります。修理済みデバイス、一部の修理済み(またはほぼ) そうです。私がシェパードさせていただいた Unix の中には、システムのオブジェクト コードが同梱されているものもあり、デバイスを追加/再構成するには、C ファイルをいくつか編集し、カーネルを再コンパイルして再リンクする必要がありました。とても楽しかったです。

答え2

z80 プロトタイピング ボードのようなものを入手して、シリアル ポートからビット バンギングを試みる、または、DOS でエミュレートされた IBM PC を実行し、DOS IRQ を使用して同じことを実行します。

メモリマップテキストディスプレイを備えた古い Z80 マシンでは、少なくともテキストを表示するのは簡単です。

アセンブラ、Pascal、Ada、C (このために C++ を使用する理由)、BASIC、およびその他の言語を使用して、このようなことを行うことは可能です (簡単に、または少し難しく非現実的ですが)。ただし、かなりの作業が必要になります。

かなりの量のメモリをサポートできる比較的新しいプロセッサについては、C/アセンブラ/Ada (Pascal もそうだと思います) でプログラミングする場合、MIPS2000 とその互換プロセッサ (512 MB の RAM に簡単に直接アクセスできる大容量のメモリ空間) を検討してください。このプロセッサ ファミリのメモリ アーキテクチャはかなり単純であるため、このように言います。

grub のソースをチェックしてください!

起動時にプログラム (ブートローダー) をロードする方法に興味がある場合、またはスペースインベーダー (ベアメタル上で実行されるスペースインベーダーのクローン) などの GRUB 化されたゲームを調べてみてください。

仮想マシンでgrub-invadersを起動できる幼虫侵入者を参照

関連情報