2012-02-14 9 views
2

私は組み込みアプリケーションで使用しているIntelベースのSBCを持っています。これは、Fintek Super I/Oチップに接続されたデジタルIO(DIO)ポートを備えています。私は他のハードウェアを制御するためにこのポートの出力ライン上のビットを設定できるようにしたい。Linuxのドライバでリアルモードに切り替える方法

幸いなことに、メーカーのBIOSは、ちょうどこれを行うための機能が付属しています:

AX=6F09h 
bl=<bits> 
int 15h 

は、残念ながら、私はプロテクトモードで64ビットのLinuxを実行していますよ。私はbios割り込みを、ユーザー空間プログラムから、または必要に応じてカーネルドライバから呼び出す方法はありますか?

代わりにFintekチップに直接レジスタを設定することもできますが、チップのどのピンがDIOヘッダに接続されているかを正確に知る必要があります。もちろん、ボードリビジョンからボードリビジョンに変更されます。

答えて

1

まず、Linuxが割り込みが存在するメモリを上書きしないようにする必要があります。

あなたは、簡単ではないOSランタイムの方法でリアルモードになることはできません。メモリ内のどこに割り込み関数があるのか​​を調べ、ある種のエミュレータを使ってその16ビットマシンコードを解釈し、64ビットロングモードプロシージャを実行する必要があります。このトピックについて詳しくは、OSDev ForumsOSDev Wikiを検索してください。

(ヒント:保護モードでのVESAの使用に関する質問を参照してください)

1

あなたのディストリビューションにはおそらくlibx86のパッケージがあります。 libx86はx86ではlrmi(DPMIの反対)を使用し、AFAIK vm86モードは64ビットモードでは使用できないため、x86-64ではx86エミュレータを使用します。

+0

True、vm86モードはもはやロングモードコードからは使用できなくなりました(「ロングモード」ではなく「64ビット」 - 長いモードで実行されている32ビットコードであっても(名前は忘れていました)vm86 )。 – Griwes

0

私はプロトタイプの前にブートローダにそれを入れましたが、持ち越されないかもしれません。どちらかといえば、「どこにいたのか」に基づいてチップの位置を修正するか、修正するかです。

関連する問題