Linus Torvaldsのエミュレート:独自のオペレーティングシステムを最初から作成する(VIII)

独自のオペレーティングシステムを作成する方法に関する一連のチュートリアルに戻ります。 最終的にオペレーティングシステムと対話できるようになるので、この章を非常に気に入っていただけると思います。 今日はキーボード入力を読みます。 このため、スキームはタイマーのスキームと似ています。 とにかくIRQを使用する必要があるため、タイマーと同じように開始します。

ND_IRQ_InstallHandler(1、&ND_Keyboard_Handler);

ただし、キーボードハンドラーは、キーを読み取ってバッファーに格納するため、やや複雑になります。

extern "C" void ND_Keyboard_Handler(struct regs * r){unsigned char scancode = ND ::キーボード:: GetChar(); if(scancode!= 255){ND :: Screen :: PutChar(scancode); stringBuffer [stringPos] =スキャンコード; stringPos ++; }}

http://gist.github.com/634afddcb3e977ea202d

ND :: Keyboard :: GetCharという関数をどのように呼び出すかを確認できます。 そこで文字を取得し、それが空の文字でない場合(ここでは255を使用しているので、より良いシステムを使用する必要があります)、画面に文字を配置し、文字の単純なバッファーに格納します(これも改善される可能性があります。現在のシステムオーバーフローする可能性があります)。

nsigned char ND ::キーボード:: GetChar(){unsigned char scancode; scancode =(unsigned char)ND ::ポート:: InputB(0x60); if(scancode&ND_KEYBOARD_KEY_RELEASE){255を返す; } else {return en_US [スキャンコード]; }} char * ND ::キーボード:: GetString(){while(stringBuffer [stringPos-1]!= '\ n'){} stringPos = 0; stringBufferを返します。 }

http://gist.github.com/2d4f13e0b1a281c66884

ここでは、押されたキーがどのように取得されるかを確認できます。 0x60では、常に最後に押されたキーがあります。 実際、IRQを使用せずに直接読み取ることはできますが、変更がいつ発生したかを特定する方法がわかりません。 そこで、取得したコードがリリースされたキーに対応していることをAND演算で確認します。

その場合、255を返します(後で無視するため)。それ以外の場合は、キーが押されています。 その場合、en_USという配列の位置を返します。 この配列にはどのような情報が含まれていますか? この配列は、キーマップまたは文字マップと呼ばれるものです。 ご存知のように、言語が異なればキーボードも異なり、キーが上書きされるためサポートされていません。 したがって、en_USは各コードに対応するキーを提供し、アメリカンキーボードで機能します。

unsigned char en_US [128] = {0,27、 '1'、 '2'、 '3'、 '4'、 '5'、 '6'、 '7'、 '8'、 '9'、 '0 '、'-'、' = '、' \ b '、' \ t '、' q '、' w '、' e '、' r '、' t '、' y '、' u '、' i '、' o '、' p '、' ['、'] '、' \ n '、0、/ * Ctrl * /' a '、' s '、' d '、' f '、' g '、 'h'、 'j'、 'k'、 'l'、 ';'、 '\' '、' ''、0、/ *左シフト* / '\\'、 'z'、 'x'、 'c'、 'v'、 'b'、 'n'、 'm'、 '、'、 '。'、 '/'、0、/ *右シフト* / '*'、0、/ * Alt * / ''、0、/ *キャップスロック* / 0,0,0,0,0,0,0,0,0,0、/ * F1-F10キー* / 0、/ * Numロック* / 0、 / *スクロールロック* / 0、/ *ホームキー* / 0、/ *上矢印* / 0、/ *ページアップ* / '-'、0、/ *左矢印* / 0、0、/ *右矢印* / '+'、0、/ *終了キー* / 0、/ *下矢印* / 0、/ *ページダウン* / 0、/ *キーの挿入* / 0、/ *キーの削除* / 0,0,0、 0、0、11、/ * F12-F0キー* / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

フレーズを取得する定義済みの関数もありました。 目的は、文字列を必要とするアプリケーションから文字列に簡単にアクセスすることですが、現時点ではXNUMXつだけです。 NextDivelが持つ可能性のある将来のシェルの縮小版であるNextShellLiteについて話しています。 NextShellLiteの目的は、新しい機能を徐々にテストするための縮小シェルを提供することだけです。 ここにシェルコードを配置するつもりはありませんが、NextDivelコードに含めました。

現時点では、個別のプログラムとしてではなく、カーネルによって呼び出される関数として機能します。これは主に、実行可能ファイルを実行するオプションをまだ追加していないためです。 そしてもちろん、シェルが新しいキーボード入力機能でどのように機能するかについてのいくつかの写真。

次のShellLite


Googleで優先ソースとして追加する