diary)この広告は、90日以上更新していないブログに表示しています。勉強はじめに今回からLions本の最終セクションを見ていきます。今回は22章を扱います。最初にキャラクタデバイスとは何かを解説し、その後ラインプリンタのデバイスドライバを見ていきます。キャラクタデバイスとはUNIXではデバイスを二つの種類に分けて扱っています。キャラクタデバイスとブロックデバイスです。ディスク装置など前回のエントリまでは主にブロックデバイスについて見てきました。今回のエントリからキャラクタデバイスをどう扱うかについて見ていきます。file(inode)を作っておく必要があります。minor番号を設定しないといけません。minor番号が格納されます。readを使って処理を行います。デバイスドライバ以前RK(ブロックデバイス。ディスク装置)のディスクドライバを見ましたが、キャラクタデバイスも同じようにデバイスドライバがカーネルとデバイスのインターフェイスを担います。可能ならば、一つのデバイスドライバで似たタイプのデバイスを扱えるように、さらには複数のデバイスを同時に扱えるように、デバイスドライバのコードを書きます。)を使用して処理を行うように書かれています。)の詳細は次回のエントリで扱う予定です。デバイスドライバ実際に、キャラクタデバイスドライバの一つであるLP11のデバイスドライバを見ていきます。ソースで言うとunix/lp.cがそれにあたります。LPのレジスタや関わるデータなどLP11は二つのレジスタを持っています。registerには、LPがready状態であることを示すDONEフラグ、LPの動作が完了した場合、もしくは、エラーが起きたときにシステムに割り込みをかけることを表すIENABLEフラグ、エラーが起きたときにセットされるERRORフラグが格納されます。registerには出力する1文字のデータ(7bits)を格納します。registerに値が格納されると、LPの文字出力動作が開始されるようです(要確認)もっと詳細が知りたい方はLP11のhandbookをご覧になってください。カーネルの中ではLPのレジスタを示すアドレスが設定(8812行目、8823行目)されています。lpbuf;};以下のように書くことで、LPのレジスタにアクセスすることができます。;また、カーネル中にはlp11という構造体が定義されています。)の中で使用されます。poolが溢れないかどうかをチェックするときにも使用されています。flagはLPが持っている機能やオープン済みかどうかを表します。mccは1行中に実際に出力した文字数、cccは1行中に出力する文字数、mlcはページ中の行数を表し、LPの出力文字の位置調整などに使用されます。スペースやインデントのために空白を出力するときなどは、その度に空白を出力するのではなく、cccをインクリメントだけしておきます。実際に何か文字を出力するときに、mccとcccの差分だけ空白をまとめて出力してから、その文字を出力するようになっています。)(8850行目)はLP11のopen処理を行います。