WireSharkをコマンドで使う方法
CPU自作は開発環境が壊れてしまったのでしばらくお休みです。
ネットワークのトラブルシューティングでキャプチャを取る事があると思います。
現象が頻発する場合は良いのですが単発で起きる現象の場合だと何日もキャプチャし続ける必要があります。
でもWireSharkって取りっぱなしだと重くて端末が落ちるんだよね…
今回のお題はWireSharkです。
ご存知WireSharkはパケットキャプチャーソフトの代表例です。
でもGUIなので短期間のキャプチャしかできないと思われています。
長期間の取得はtcpdumpじゃないとだめとか…
実はWireSharkもLinuxのtcpdumpと同様にコマンドで取れます。
オプションを適切に設定すれば長期間無人運転できますよ。
コマンド例
"C:\Program Files\Wireshark\dumpcap.exe" -a duration:3600 -b filesize:26000 -s 75 -i キャプチャーポート -B 50 -w D:\Capture\cap1.pcapng
●内容
1時間で自動停止し、約25MBずつでファイルを分割します。24時間などといった指定でも問題なく動作します
パケットの先頭から75バイトのみ記録し、キャプチャバッファに50MB確保します。
(先頭75バイトのみなので後ろのデータは捨てます)
キャプチャーポートというNICを対象とします。
キャプチャーデータはD:\Capture\cap1.pcapngという名前に対して連番で保存します。
この指定だとソースIPなどで制限かけていないのですぐにデータであふれてしまいます。
コマンド例
"C:\Program Files\Wireshark\dumpcap.exe" -a duration:86400 -b filesize:26000 -s 75 -f "src net 192.168.0.0/24 or dst net 192.168.0.0/24" -i キャプチャーポート -B 50 -w D:\Capture\cap1.pcapng
24時間192.168.0.0/24のトラフィックを記録し続けます。
さらに特定のホストが含まれる通信は除外したい場合は下記の通りになります。
"C:\Program Files\Wireshark\dumpcap.exe" -a duration:86400 -b filesize:26000 -s 75 -f "src net 192.168.0.0/24 or dst net 192.168.0.0/24 and not host 172.16.0.100" -i キャプチャーポート -B 50 -w D:\Capture\cap1.pcapng
172.16.0.100のホストは除外します。
さらに宛先ポートが80の物だけにする場合
"C:\Program Files\Wireshark\dumpcap.exe" -a duration:86400 -b filesize:26000 -s 1500 -f "src net 192.168.0.0/24 or dst net 192.168.0.0/24 and not host 172.16.0.100 and dst port 80" -i キャプチャーポート -B 50 -w D:\Capture\cap1.pcapng
となります。
この例に関しては絞り込んでいるので1500バイト記録するようにしています。
また、ポートは範囲で記入することもできます。
tcp portrange 10000-20000
●詳しくはこちら公式ヘルプのURL
https://www.wireshark.org/docs/man-pages/dumpcap.html
https://wiki.wireshark.org/CaptureFilters
上記の例ではプロセスの暴走を抑止するため24時間で停止させます。
なので毎日決まった時間タスクスケジューラで上記内容を記述したBATを起動すれば信頼性の高いキャプチャが可能です。
さらに7zipなどとコラボすればキャプチャしたデータを7z形式で圧縮して、元データを削除するなんてこともできます。
【4bit CPU自作】TD4の真似をするソースコード
今回はTD4の動作を真似するVerilogHDLによるソースコードを載せています。
ソースコードは下記よりダウンロードできます。
真似というのは本来のTD4で使用されている論理素子を無視してVerilogHDLの記述レベルで
書きやすいように書いたため、同じ動きはするけど回路的には非常に遠い物になっているはずです。
CPUを単純かつ乱暴に書いてしまうと、プログラム格納領域から拾ってきた命令を調べて
自分の知っている命令を分類して実行するだけです。
そのため実装する命令の数だけif文をつなげれば同等の事ができるはずです。
もちろんこの実装は非効率的であるため、実行速度は出ないでしょう。
VerilogHDLだと原始的な論理素子を積み上げてずに、直接目的の機能を組み込めるため非常に便利ですね。
で、どうやって使うのか?
VerilogHDLの習作として作ったので、プログラムROM領域もソースコードの中にベタ書きです。
TD4の仕様書を見ながらマシン語でプログラミングすることになります。
129行目からROM領域ですので、大昔のプログラマの気分に浸りながら書くことになります。
日頃あまりコードを書かない私がマシン語で書くなんてとちょっと感動に浸っておりました。
このコードですがいきなり実機に転送する前に、仮想環境でシミュレーションしましょう。
というわけで、次回はテストベンチについて書きます。
初めてGithub使いました…
【4bit CPU自作】Lチカの続き
前回は配線のファイルを作成したところだと思います。
配線を行うのでOpen Elaborated Designをクリックします。
そうすると論理素子がどのように構成されるか表示されます。
NOTにバッファがつながった形になっていると思います。
ここから論理合成を行いますので、Run Synthesisをクリックします。
数分待つとポップアップが表示されます。
Run ImplementationにチェックをつけてOKをクリックします。
最後にFPGAに書き込むデータを作りますので、Generate BitstreamにチェックをつけてOKをクリックします。
NESYS4をパソコンと接続し、電源スイッチを入れます。
書き込みを行うのでOpen Hardware Managerにチェックを入れてOKをクリックします。
Open Targetをクリックします。
Auto Connectで自動的に接続されている機器を認識して接続します。
認識されるとこのような表示になるので、Program Deviceをクリックして書き込みます。
書き込みデータをどこに保存するか聞かれるので、適当に場所を指定します。
書き込みに成功すると右端をLEDが点灯します。
一番右のスイッチをONにするとLEDが消えます。
というわけで、ハードウエア素人によるLチカですが予想よりも大変です。
配線がいらないとは言うものの、論理合成とか結構時間がかかるので何度も修正するのは
面倒ですね。
そのために、シミュレータがあるわけですが…
次回はTD4の真似をするVHDLソースコードを載せたいと思います。
【4bit CPU自作】Lチカの配線
コードは書けてもLEDは物理的な現実に存在する物なので、何らかの方法で
仮想の世界と現実の世界をつなぐ必要があります。
FPGAの場合はPinの接続とこの後の論理合成が相当します。
というわけでPinの接続をします。
H17のLEDとJ15のスイッチをつなぎます。
実機だとここになります。
そして、写真のようにxdcファイルを編集してから、Elasborated Designをクリックすると配線が終わります。
本来のXDCファイルはすべてのスイッチなどの情報がのってるので、いっぱい書いていますが、必要な部分だけでOKです。
【4bit CPU自作】Lチカ
さっそく定番のLEDチカチカ略してLチカしたいところですが、また事前準備があります。
評価ボードのピンアサイン情報が定義されたXDFファイルを入手する必要があります。
Nexys 4 DDRですが、Digilent社のWebサイトの下記URLのDSD-0000478をダウンロードしてください。
Vivadoを起動して新しいProjectを作成します。
途中でxdcファイルの指定がありますが、ダウンロードしてきたファイルを指定します。
FPGAの品番を選択する項目がありますのでNexys 4 DDRの場合、xc7a100tcsg324-1を選択します。
※BASYS 3の場合はxc7a35tcpg236-1だと思います
Lチカするだけの回路をVerilog HDLで記述します。
動作仕様
1.ボタンを押したらLEDが消える
2.ボタンを離したらLEDが点灯する
下記のようなコードになります
module led1(
SW,
LED
);
input SW;
output LED;
assign LED = ~SW;
endmodule
となります。
Verilog HDLは配線を定義する言語との事ですので、サンプルコードでは
SWの状態に対してNOTを定義しています。
SWがONであれば0を返しOFFであれば1を返すようにしています。
【4bit CPU自作】環境準備
作例ではNexys 4 DDRを使用していきますが、他のFPGA評価ボードでも使用できると思いますので適宜読み替えて進めていただければと思います。
今回使用するNexys 4 DDRはXilinx社のArtix-7というFPGAを搭載しています。
BASYS 3とNexys 4、Nexys 4 DDRも同じ品種のFPGAを使用しています。
あとFPGAベンダーで主流なのはXilinx社とAltera社の2つです。
Altera社の評価ボードですとDE0やDE1が一般的になるかと思います。
記述言語は共通ですので記述自体は流用できると思います。
FPGAはVerilog HDLという専用の記述言語を使用して素子の定義を行いますので
当然ながら、専用の開発環境が必要になります。
開発環境って有料ですよね?という疑問がありますが、機能限定版なら無料です。
Xilinx社のWebサイトからVivado Web Packをインストールしてください。
ダウンロードとライセンスアクティベーションをするために、サインアップが必要となりますのでご注意ください。
ライセンスですが、必ずVivado Web Packのライセンスを取得してください。
標準構成でインストールしライセンス認証ができ、起動できたら下記のような画面が
表示されます。
※執筆時ではVivado 2015.2を使用しています
インストールでお腹いっぱいですね。
私はライセンス取得ではまりました。
次回はFPGAボードのLEDを点灯できたらいいなぁ
CPUをどうやって作ろうか?
どのような手法でCPUを自作したらいいのでしょうか?
ご存じのとおりCPUは2進数で計算処理をする装置で、さらにその2進数は電圧の低いと高いで表現され、その電圧はトランジスタの組み合わせで表現できます。
計算はトランジスタを組み合わせて作られたANDやOR、NOTなど論理の組み合わせで
表現でき、ANDとかを集積回路に集積したICが汎用ロジックICとして販売されていました。
販売されていましたというのも、今時単品のロジックICをたくさん使って希望の回路を実現するよりは、集積率の高い集積岐路に押し込んでしまった方が安くて安価に作ることができるのです。
大昔は実際にロジックICを大量に使ってコンピュータが作られていたのですが、集積回路の集積率が上がったため今ではCore i7などを見たらわかるように一つのチップで構成されています。
この前ふりで汎用ロジックICで、CPUを作りそうな雰囲気を出していましたがそんなつもりは全くなく、お手軽ではんだ付けもいらないFPGAで作ります。
(表示装置自作のためはんだ付けはするかもしれない…)
FPGAって?
組み込みハードウェアのエンジニアではないのでまったく詳しくないのですが、FPGAは好き放題に内部の論理素子を定義できる物だそうです。
もう少し正確に書くと空の論理素子が大量に集積されており、FPGAのスペックの範囲で好きに配線を書き換える事ができるものです。
もちろん専用設計の集積回路と違って速度は遅い上に集積率も良くないです。
ネットワーク機器に搭載されている事が多いので、ITエンジニアでご存知の方もいらっしゃると思います。
というわけで、このFPGAの中にCPUとして動作する論理素子を定義してあげれば、CPUとして動作するはずです。
今回ターゲットとなるFPGA評価ボードは「Nexys 4 DDR」で、このボードにはXilinx社のArtix-7というFPGAが搭載されています。
似たようなボードではもっとお安くて入手しやすいBASYS 3などがあります。
実装するCPUですが、高度な物は実装できそうにありませんので「CPUの創りかた」に載っているTD4のバイナリ互換CPUを実装したいと思います。
備考
Nexys 4 DDR はDigi-Keyで購入しました。
BASYS 3もDigi-Key経由で購入できますが、秋月電子様でも販売しています。
Nexys 4 はストロベリーリナックス様でも購入できます。
Digi-Keyだと海外通販となり色々面倒ですので、国内調達ですぐ欲しいという場合はBASYS 3かNexys 4が良いでしょう。
Nexys 4 DDRはオンボードで128MBのメモリが搭載されています。