私は現在boot.s
、最初のLinuxカーネルのソースにあるファイルを読んでいます(0.01が実際に最初のパブリックリリースであると仮定しています)。
私はCとASMを知っていますが、後者は前者よりかなり少ないです。それでも、ソースファイルのコードを理解し、本質的に把握できるようです。
しかし、このファイルは私を混乱させました。これは、プロテクトモードではなくリアルモードであるためです。言うまでもなく、リアルモードで記述されたASMコードはこれまで見たことがありません。プロテクトモードは、私が生まれる前にx86 OSが実行されていた事実上のモードだったので、当然のことです。
これが私がよりよく理解したいルーチンです:
/*
* This procedure turns off the floppy drive motor, so
* that we enter the kernel in a known state, and
* don't have to worry about it later.
*/
kill_motor:
push dx
mov dx,#0x3f2
mov al,#0
outb
pop dx
ret
調べてみるoutb
と、コンピュータのポートにバイトを渡すために使用されていることがわかりました。このシナリオでは、最初の引数として「モーターの停止」バイトを渡し、2番目の引数としてフロッピードライブのポート番号を渡すというCのドキュメントに基づく推測を危険にさらします。
このインターフェイスはBIOSによって提供されていますか?またはフロッピードライブで直接?BIOSには、すべての基本的なデバイスの非常に基本的な操作のための質素な「ドライバー」があると思います。
これが私が困惑しているところです:のような数字#0x3f2
が薄い空気から引き出されているようです。それらは明らかにハードウェアのポート番号か何かです。このファイルにはそのような番号が散りばめられており、それらが何を指しているのか説明はありません。リアルモードから受信できるすべてのハードウェアポートと制御番号を示す包括的なリファレンスはどこにありますか?また、ファイルは、ハードコードされたメモリアドレスを使用して、起動プロセス全体でカーネルをメモリ内で移動させるようです。リアルモード中に上書きできるメモリアドレス範囲のガイドはどこにありますか?
また、BIOSと内部ハードウェア割り込みの衝突を回避するための割り込みの再プログラミングに関するLinusのコメントも読みました。私はうそをつくつもりはありません、それは私の頭の真上に行きました。
ヘルプは素晴らしいでしょう。あなたが疑問に思っている場合に備えて、Googleはこのトピックについてまばらに見えます。