チュートリアル
Linuxでファイルサイズを後から変更できるドライバ
課題
・Linuxシステムで、確保するバッファサイズやリングバッファの設定を変更したい。
解決方法
IOCTL処理を実装します。
従来のサンプルドライバでは、固定値でバッファサイズやリングバッファの設定をして
カーネルに組み込んでいましたが、IOCTLから設定変更を可能にすることで、
カーネルをリビルドしなくても、設定を変更することができます。
効果
目的に応じて確保するバッファサイズやリングバッファを使用するかといった設定を
後から変更できて、設定変更の際に、都度カーネルビルドを行う必要がありません。
一度組み込んでしまえば、各開発者毎やテスト内容毎に設定を変えて使用することができます。
ドライバのカスタム方法
DT10を環境に組み込む際の作業手順と使い方を説明します。
接続方式は、ファイル書き出しです。
1. サンプルドライバのダウンロード
対応OS | 接続方式 | 言語 | イベントID出力方式 | ダウンロード | 備考 |
---|---|---|---|---|---|
Linux | ファイル書き出し (18Byte) |
C/C++ | カーネル情報出力 ポイント挿入 |
ダウンロード | DT10Ver11.00以降のサンプルドライバ |
Linux | ファイル書き出し (18Byte) |
C/C++ | カーネル情報出力 ポイント挿入 |
ダウンロード | DT10Ver10.51以前のサンプルドライバ |
アプリ側の「イベントID出力方式」の設定では、必ず「カーネル情報出力ポイント挿入」を選択してください。
2. ioctlフォルダの構成
proc
├app ・・・ 制御・出力用のdt10app 処理
│ ├ProcFileOutput.c ・・・ dt10app の実体
│ └Makefile
│
├kernel ・・・ Kernel向け階層は[Linux]相当
││
│└drivers
│ └misc
│ └dt_datawriting_drv.c ・・・ DT10カーネルモジュール
│ MakefileはmiscのMakefileに追加
│
└userspace ・・・ ユーザーランド向けファイル
│
└dt10_tpdrv.c ・・・ ユーザーランド向けドライバ
対象アプリのMakefileに追加
appフォルダ、及び userspaceフォルダ以下のファイルは、ユーザーランド層に対応しています。
kernelフォルダ以下のファイルは、カーネル層に対応しています。
kernelフォルダについては、Linuxのフォルダ構成に従った階層になっていますので、
構成を変更せずに、そのままの位置で設置します。
3. IOCTLの固有値の空きを調査
IOCTLを使用する場合、他のデバイスドライバ等を競合しないよう、独自のユニークな値を持つ必要があります。
その為、各環境毎に設定されているioctl-numberの空き固有値を調べて、DT10独自の設定値を取得する必要があります。
Linux/Documentation/ioctl/ioctl-number.txt から空き固有値を参照できます。
「ioctl-number.txt」に記載されていない領域が、未使用の値です。
上記の例をみると、’g’の領域が未使用なので、今回はこちらを使用します。
4. dt_datawriting_drv.c の登録
linux/drivers/misc直下に「dt_datawriting_drv.c」を登録します。
miscのMakefileに 「dt_datawriting_drv.c」 を登録します。
手順「3. IOCTLの固有値の空きを調査」で調べた固有値を、 DT10_IOCTL_MAGIC に設定します。
5. userspace/dt10_tpdrv.c の登録
DT10のテストポイントを挿入したアプリのMakefileに「dt10_tpdrv.c」を追加します。
特に変更は必要ありませんので、そのまま登録します。
6. app から dt10appの設定
サンプルドライバ内のMakefileからMakeを実行する事で、「dt10app」が作成されます。
ソースファイルの実体は、同ファイル内のProcFileOutput.cとなっています。
Makeする前に、以下の点を修正します。
6-1. ConvertData.DATの保存先の変更
proc上に保存されているログデータの保存先を指定します。
#define CONVERT_FILE を変更します。
6-2. DT10_IOCTL_MAGICの修正
「dt_datawriting_drv.c」 側と値を合わせる必要がありますので、こちらも変更します。
変更が完了したら、Makeコマンドを実行し 「dt10app」を生成します。
7. 動作確認
Procを操作する為、dt10app は root権限で操作する必要があります。
こちらは操作の例です。Convertdata.DATが生成されることを確認します。
「dt10_app」は、以下の仕様となっております。
dt10app [logging Start/STOP] [BufferSize(Mbyte)] [RingBufferflag]
「dt10app」の引数は[0-3]まで指定することが可能です。
●引数を指定しない場合
dt10proc内に記録されているログデータを指定の位置に出力します。
[admin@localhost app]$ ./dt10_app
●logging Start/STOP
ログ取得の開始停止フラグです。
停止の場合 [0] を指定します。
開始の場合 は[1]を指定します。この時、続いて引数を指定することでバッファサイズや
RingBufferを設定するかなどが選択できます。
▼取得停止の時
[admin@localhost app]$ ./dt10_app 0
▼取得開始の時
[admin@localhost app]$ ./dt10_app 1
●BufferSize(Mbyte)
バッファリングするログのサイズをMbyte単位で指定します。
1ステップあたり18Byteになりますので、端数部分は切り捨てです。
バッファサイズに30MByte(1747626ステップ分)を指定する場合
[admin@localhost app]$ ./dt10_app 1 30
なお、環境によって確保できるバッファサイズは異なります。
確保可能なサイズについては、以下のコマンドからご参照ください。
[admin@localhost app]$ cat /proc/meminfo
上記のコマンド実行時に表示されるデータの中で、
以下のようになっていますので、VmallocChunkの値から算出ください。
なお、Used値は状況により前後します。確保するサイズはTotal値の半分くらいが目安です。
VmallocTotal: 122880 kB
VmallocUsed: 2172 kB
VmallocChunk: 111092 kB
VmallocTotal ・・・ メモリサイズ
VmallocUsed ・・・ 使用中のサイズ
VmallocChunk ・・・ 空き容量
●RingBufferflag
確保したバッファをRingBufferの設定にするフラグです。
値が”1″のときRingBufferを使用します。
未指定の場合は、RingBufferは未使用(値は”0″)で設定されます。
30MのバッファをRingBufferとして使用するとき
[admin@localhost app]$ ./dt10_app 1 30 1