質問

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

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

x86アセンブリは初めてなので、プロテクトモードから標準ハードウェアを操作するための優れたリソースを探しています。 NASMでアセンブリソースコードをコンパイルし、DJGPPでコンパイルされたCソースコードにリンクしています。提案はありますか?

役に立ちましたか?

解決

MITオペレーティングシステムクラスには、多くの優れたリファレンスがあります。特に、キーボードとマウスのプログラミングについては、 Adam Chapweskeのリソースをご覧ください。

要するに、はい、rawモードのin / outポートを使用します。これには、カーネルモードで実行するか、EFLAGSレジスタにI / O許可ビット(IOPL)を設定する必要があります。 I / O権限の詳細については、このページをご覧ください。 。

他のヒント

実際のモードと保護モードで、標準のレガシーハードウェアを同じ方法で使用します。この場合、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 (キーボード用)。

慣れていない場合は、I / Oポート番号(16ビット値)を受け取るIN(読み取り)およびOUT(書き込み)オペコードを介してI / Oポートのコンポーネントと通信します。読み書きする値(8、16、または32ビット)。読み取りまたは書き込みサイズが重要であることに注意してください! 8ビット(またはその逆)を想定しているものに16ビットを書き込むことは、災害のレシピです。これらを頻繁に使用するため、これらのオペコードに慣れてください(いくつかの重要なものを含むいくつかの周辺機器と通信する唯一の方法です;他の周辺機器はメモリマップドI / O(MMIO)またはバスマスタリングDMAを使用します)。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top