3

それで、この夏、80x86 のアセンブリ言語を学ぶことにしました。組み立てに関する本を 4 冊手に取りました。これまでのところ、最初の 2 つを読み、3 つ目は途中まで読んでおり、提示された内容はすべて理解していると思います。私はいくつかの Hello World プログラムと、本からの他の小さな演習を書きましたが、この言語に非常に慣れています。ただし、これまでどの本でも取り上げられていないことが 1 つありますが、それは私が最も興味を持っていることです。つまり、アセンブリ言語からハードウェアを直接アドレス指定するにはどうすればよいでしょうか? これまでの本では、著者はシステム コール、メモリ内の特定の関数へのジャンプ、および割り込みを使用してきましたが、これらの方法はシステムに既に存在するソフトウェアに依存しています。

NASM を使用してプログラムを作成し、それらを古い Pentium I コンピュータにロードしています。現在、OS は使用しておらず、BIOS のみを使用しています。私がしようとしているのは、自律的で BIOS に依存しない小さな OS を作成することだと思います (初期ブートを除く)。誰でも私を助けることができますか?

4

2 に答える 2

6

BIOS のみでコードをどのように起動して実行していますか?

実際に BIOS しか使用していないと仮定した場合、または DOS を使用していたとしても問題ありません。ハードウェアをアドレス指定し、命令でハードウェアレジスタのアドレスを指定するか、そのアドレスをレジスタに入れ、レジスタの間接的な読み取りまたは書き込みを行うだけです。

ハードウェアへのアクセスは、オペレーティング システムが邪魔をしている場合にのみ困難です。もちろん、ハードウェアに何か有用なことをさせることは、オペレーティング システムを使用する方がはるかに簡単です。

幸いなことに、BIOS は pci(e) ハードウェアを列挙しています。これは PC のやり方です。そのため、DOS ユーティリティを使用して、ハードウェアがどのように列挙されているかを調べることができます。ハードウェアの PCI(e) アドレスも x86 アドレスであり、2 つのアドレス空間が重複するため、周辺機器の PCI(e) アドレスを取得したら、そのアドレスをコード。当然のことながら、ビデオなどでは pcie ウィンドウが比較的小さいため、周辺メモリをページングする必要がありますが、これは PC や x86 のものではなく、周辺機器に固有のものです。

マザーボードにシリアル ポート/uart がある場合は、ハードウェアに直接アクセスすることから始めるのが最適です。

ハードウェアから開始するのではなく、シミュレーター pcemu などを使用することをお勧めします。シミュレーターの選択によっては、何が起こっているのかをよりよく把握でき、uart のような周辺機器ははるかに単純な場合があります。初期化する必要はなく、バイトを投げ始めるだけです(詳細がわかるまで)。

于 2013-07-09T18:11:07.363 に答える
4

dwelch は完全に正しいですが、より基本的なレベルであなたの質問に答えたいと思います。
ほとんどの場合、制御レジスタとステータス レジスタを介してハードウェアにアクセスします。最も単純なケースでは、たとえば、シリアル ラインから読み取りたい場合で、新しい文字が到着するのを待っています。ステータス レジスタがビットを「準備完了」に設定すると、別のレジスタから文字が読み取られます。
これは、メモリ アドレスのようなレジスタをアドレス指定する必要があることを意味します。繰り返しますが、ほとんどの場合、これはレジスタをアドレス空間にマッピングすることによって行われます。つまり、レジスタには、メモリが存在しないアドレス範囲 (最上位アドレスなど) にメモリ アドレスがあります。その後、ロードやストアなど、メモリにアクセスするほとんどの命令を使用できます。
CPU は、プログラム可能なメモリ管理ユニットによって物理アドレス空間 (レジスタが配置されている場所) にマップされた仮想アドレスを使用するため、実際の状況はより複雑です。

于 2013-07-09T18:13:55.577 に答える