●LKST v1.4の特徴(LKSTv1.3.1からの変更点) 1.記録バッファ関係の変更点 1.1 記録バッファの種類   記録バッファは静的共有バッファと、CPU毎の動的バッファの2つに分かれました。 a) 静的共有バッファ  静的共有バッファはシステムに1つ存在し、システム起動時に確保されます。  この静的共有バッファへのアクセスは、他のバッファ(次のb)を参照)へのアクセスとは少し異なります。静的共有バッファに情報を記録するためには、専用のイベントハンドラか、専用のカーネルAPIを用いる必要があります。また静的共有バッファを読むのにはioctl readを使用します。(現在はデーモンから読み出すことは出来ません) b) CPU毎の動的バッファ  動的バッファの管理テーブルをCPU毎に持ち、特にSMPシステムでは、他のCPUとは独立して自身のバッファを管理します。バッファIDはCPU毎に割り当てます。すなわち、CPU1が持っているID0のバッファはCPU2が持っているID0のバッファとは異なるバッフ ァです。 1.2 動的バッファのリンクリスト構成  バッファリンクリストは、次のシフト先を表す一方向のリンクリストになりました。  同じCPU内のバッファであれば、どのバッファでも次のシフト先に指定することが出来ます。すなわち、リストの先頭のバッファに戻したり(バッファリング)、リストの途中の任意のバッファへのジャンプすることも可能です。  また複数のバッファリストやバッファリングを作成し、それらを自由につないで1つのリストにすることも可能です。  次のシフト先を指定していない場合には、そのバッファに対してサイクリックに書き込みます。 注)バッファは新規作成時に、リンクリストに自動的に繋がることはありません。リンクは利用者が明示して下さい。 1.3 動的バッファのサイズ  バッファを作成する場合、バッファサイズは、4KBの倍数単位で指定することが出来ます。利用者から指定されたサイズが4KBの倍数でない場合には切り上げ計算を行ないます。  LKSTは、対象バッファに対して、指定バッファサイズに、管理やデータ落ち防止用の領域4KBを加えたサイズの領域を確保します。管理用の「イベントバッファディスクリプタ」領域は64バイトで、バッファの状態を表すために使います。その後ろの4032バイト(63エントリ)はデータ落ち防止用の「マージン」領域として使用します。 マージン領域に書き込まれた情報も利用者は読むことができます。したがって、利用者には(指定サイズを4KB倍数に調整した値+4032)を確保したサイズとして通知します。        64bytes     +------------------------------+ |イベントバッファディスクリプタ| +------------------------------+ | | | マージン(63エントリ) | | | | | +------------------------------+ | | | 記録バッファ | | (利用者指定サイズ) | | | +------------------------------+ 1.4 動的バッファの読み出し a) システムコールread  システムコールreadを実行する前に、ioctl setrmod によってどのCPUのバッファを読むかを決めなくてはなりません。記録バッフ ァはLRU(Least Recently Used)方式で管理されており、システムコールread(つまり read命令)を発行すると、LKSTがLRUアルゴリズムに従って最適なバッファを順次探して読み出します。一度readで読み出したバッファはLRUリストから外れます。もう一度読み出したい場合には、ioctl readを使えば読み出すことが出来ます。(次のb)を参照)  さらに、システムコールreadでは非ブロックモードをサポートしました。fctrl()を 使ってデバイスを非ブロックモードにしてからシステムコールreadを発行すると、データのあるバッファがなくなり次第、すぐに呼び出し側に戻ります。 b) ioctl read  バッファIDをCPU毎の管理に変更したので、任意のバッファを読み出す時には、そのバッファIDとCPU番号を指定する必要があります。バッファの読み出しは、必ずそのバッファの先頭からになります。一度に全て読み出したい場合は、バッファサイズを調べてから、そのサイズ分だけ読み出して下さい。また、これまでは一度読み出したバッファは二度と読み出せませんでしたが、v1.4からはioctl readを使えば何度でも読み出すことが出来ます。 2. マスクセットとイベントハンドラの変更点 2.1 マスクセットとイベントハンドラの名前  マスクセットの名前は他のマスクセットの名前と重複できません。イベントハンドラの名前も同様です。ただし、マスクセットの名前とイベントハンドラの名前は重複可能です。 2.2 名前からのIDの取得  新たに追加されたioctlとカーネルAPIを使うことで、マスクセットやイベントハンドラの名前から各々のIDを検索することが出来ます。 ●コマンドの変更  上記仕様変更に伴ない、コマンドの仕様も一部分変更しました。 1. lkst コマンド  "lkst all"と"lkst status"コマンドは、バッファの数を表示しません。その代わり、CPUの数とLKSTのバージョンを表示します。バッファのリスト表示の変更点は後述します。 2. lkstbufコマンド  殆ど全ての操作にCPU指定オプション(-c)が追加されました。 2.1 read操作(変更)  lkstbufコマンドのread操作は静的共有バッファとCPU毎の動的バッファに対応するように変更しました。  ・動的バッファ(例:CPU0のID0のバッファ)を読むには以下のように指定します。 % lkstbuf read -c 0 -b 0 [備考]  * -bを指定しないときには、CPU0にある全てのバッファを読み出します。(LRUリスト更新)  * -cを指定しないときには、全てのCPUのID0のバッファを読み出します。(LRUリスト非更新)  * 両方とも指定しない場合は、(静的共有バッファを除く)全てのCPUにある全てのバッファを読み出します。(LRUリスト更新)  ・静的共有バッファを読むには次のように-Sオプションを指定します。 % lkstbuf read -S 2.2 create 操作(変更)  バッファ作成にはread操作と同じく、バッファIDとCPU識別子を指定します。バッファIDとCPU識別子を指定しない場合、LKSTが全CPUに対して新しいバッファIDを割り当て、バッファを作成します。  バッファは仕様変更の1.3で述べたように、4KBの倍数のサイズで生成されます。指定されたバッファのサイズが4KBの倍数でなければ自動的に4KB単位に切り上げます。 またマージン領域も追加されます。したがって返す結果もv1.3.1の時と違います。  例えば次のように10000バイトのサイズを指定した場合: % lkstbuf create -s 10000 次のように結果を表示します(UPの場合)。 New buffer was created, cpu=0, id=1 size=12288 + 4032(margin)  この結果から、新しく作られたバッファの(本体の)サイズは4KBの倍数である12288バイト、マージン領域の4032バイトが追加され、新しいバッファの全体のサイズは16320(12288+4032)バイトであることがわかります。 2.3 link, shift, jump操作(追加と変更)  ・link操作   lkstbufコマンドのlink操作は、-cオプションによってCPUを指定し、そのCPUの対象バッファの次のシフト先を指定/変更することができます。CPUが指定されない場合は、全てのCPUの同じバッファに対して実行されます。  例えば、CPU 0に0,1,2,3,4のIDを持つ5つのバッファがあるとします。ID 0と1のバッファでリングリストを作りたいなら、次の二つのコマンドを実行します。 % lkstbuf link -c 0 -b 0 -n 1 % lkstbuf link -c 0 -b 1 -n 0  一つ目のコマンドは、ID0のバッファのシフト先IDを1にします。二つ目も同様にID 1のバッファのシフト先IDを0にします。  同様に、ID2と3と4のバッファでリストを作りたいときは、次の2つのコマンドを実 行します。 % lkstbuf link -b 2 -n 3 % lkstbuf link -b 3 -n 4  ・shift操作、jump操作  lkstbufコマンドのshift操作は-cオプションによってCPUを指定し、そのCPUで現在書込みに使っているバッファを、そのバッファの次のシフト先に指定されているバッファに変更します。バッファのリストを壊さずにカレントバッファを変更するには、jump操作を使います。CPUが指定されない場合は、全てのCPUの同じバッファに対して実行されます。  例えばCPU 0においてバッファID 2のバッファをカレントバッファにするには、次のようにjump操作を行います。 % lkstbuf jump -c 0 -b 2 2.4 list操作(変更)  LKST1.4では、バッファはCPU毎に管理されており、「一つのリスト」にはまとまっていません。このため、lkstbuf listコマンドでは新しい形式でバッファをリスト表示する使用を追加しました。旧バージョンとの互換性のため、デフォルトでは旧来のリスト形式になっていますが、「-v」オプションを使えば、新しい形式で表示できます。 % lkstbuf list -v  このコマンドは次のように表示します。 Static buffer Size: 131072 Recid: 703 CPU: 0 Num: 2 Write: 0 Read: -- Owner:32769 Pos: 97 RQhead: 0 RQtail: 0 cpu id size[Byte] writep size recid R W next rq_p rq_n 0 0 69568 512 1087 f430bf - > 1 -- -- 0 1 16320 63 255 1000000 - - -- -- -- 2.5 print操作  "lkstbuf print"コマンドは現在、ファイルからの読み込みのみサポートしています。バッファを直接読むことはできません。 3. lkstmコマンド  lkstmコマンドは新たにconfig操作とfind操作を追加しました。また、「-m」の代わりに「-n」オプションを使うことでマスクセットを名前で指定できます。 3.1 config操作  config操作は任意のマスクセットのイベントハンドラを1つ変更したい時に使用します。マスクセットの指定が省略された時には、現在指定されているマスクセットを変更します。  例えばマスクセットID 21のイベント番号10のイベントハンドラをdefaultハンドラ(ID=1)にしたいときは、次のようにします。 % lkstm config -m 21 10 1 注)デフォルトで用意されているマスクセットは変更できません。 3.2 find操作  find操作は、マスクセットの名前からそのマスクセットのIDを検索します。  例えば、new_maskset0という名前のマスクセットを捜すには次のようにします。 % lkstm find -n new_maskset0 4. lkstehコマンド  lkstehコマンドにfind操作を追加しました。使い方はlkstmと同じです。 5. lkstdumpコマンド  バッファがCPU毎に分かれたのに伴い、lcrashで使うlkstdumpコマンドを変更しました。  lkstdumpコマンドは3つの引数を指定します。1つ目の引数はダンプ先ファイル、2つ目にはダンプするバッファのCPU ID、3つ目にはバッファIDを指定します。これにより指定されたCPUの指定バッファを指定ファイルへダンプします。  CPU IDを-1に指定するか指定を省略すると、全てのバッファをダンプします。またCPU IDに255を指定すると、静的共有バッファをダンプします。