15

私が開発している非常に基本的なカーネルのキーボード入力に取り組んでおり、完全に立ち往生しています。私が知る必要がある情報を示すことができる情報をオンラインで見つけることができないようです。

私のカーネルは現在プロテクト モードで実行されているため、リアル モードにジャンプしてから戻らないとリアル モード キーボード ルーチンを使用できません。これは回避しようとしています。プロテクト モードからキーボードにアクセスできるようにしたい。誰もこれを行う方法を知っていますか? これまでに見つけた唯一のことは、in/out ポートを使用してコントローラーと直接通信する必要があることですが、それ以上は困惑しています。もちろん、これは頻繁に出てくるものではありません。通常、アセンブリ チュートリアルでは、オペレーティング システムが実行されていることを前提としています。

私は x86 アセンブリに非常に慣れていないので、保護モードから標準ハードウェアを操作するための優れたリソースを探しています。Assembly ソース コードを NASM でコンパイルし、DJGPP でコンパイルされた C ソース コードにリンクしています。助言がありますか?

4

3 に答える 3

15

MITのオペレーティング システム クラスには、参考になるものがたくさんあります。特に、キーボードとマウスのプログラミングに関するAdam Chapweske のリソースを参照してください。

つまり、カーネル モードで実行するか、EFLAGS レジスタに I/O 許可ビット (IOPL) を設定する必要がある生の入出力ポートを使用することになります。I/O パーミッションの詳細については、このページを参照してください。

于 2008-10-20T16:59:22.383 に答える
3

リアル モードでもプロテクト モードでも、標準のレガシー ハードウェアを同じように操作できます。この場合、I/O ポート 0x60 から 0x6f で 8042 と通信する必要があり、ワイヤの反対側にあるキーボード内のコントローラーと通信します。

Google で簡単に検索すると、 http: //heim.ifi.uio.no/~stanisls/helppc/8042.html (8042 の場合) とhttp://heim.ifi.uio.no/~stanislsに興味深いリソースが見つかりました。/helppc/keyboard_commands.html (キーボード用)。

慣れていない場合は、IN (読み取り) オペコードと OUT (書き込み) オペコードを介して I/O ポートでコンポーネントと通信します。読み取りまたは書き込み可能 (8、16、または 32 ビット)。読み取りまたは書き込みのサイズが重要であることに注意してください。8 ビットを想定しているものに 16 ビットを書き込む (またはその逆) ことは、大惨事の元です。これらのオペコードは頻繁に使用することになるため、これらのオペコードに慣れてください (いくつかの重要なペリフェラルを含む一部のペリフェラルと対話する唯一の方法です。他のペリフェラルはメモリ マップド I/O (MMIO) またはバス マスタリング DMA を使用します)。

于 2008-10-20T17:06:50.667 に答える
1

8042 PS/2 コントローラは、最も単純な可能性のように見えます。

oszur11 OS チュートリアルには、https: //sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c の下に実際の例が含まれています。

ただ:

sudo apt-get install build-essential qemu
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
git clone git://git.code.sf.net/p/oszur11/code oszur11
cd oszur11/Chapter_06_Shell/04_Makepp
make qemu

Ubuntu 14.04 AMD64 でテスト済み。

私の GitHub ミラー (アップストリーム非アクティブ): https://github.com/cirosantilli/oszur11-operating-system-examples

コードが長すぎるため、ここでは再現しません。最小限の例でキーボード部分を分離できれば更新されます。

于 2015-10-20T11:05:00.720 に答える