四畳半テクノポリス

地方国立大学のクズ大学生の吐き溜めです。やる気をください

Risc-Vの逆アセンブラ

Day2:Risc-Vの逆アセンブラ

ビッグエンディアン トルエンディアン

命令コード:

 

使い方

  1. フォームに32bit(16進数で8桁)の命令を入力します。
  2. Disassembleボタンを押します。
  3. 枠内にニモニックが表示されます。

なぜ逆アセンブラを作ったのか

最初はRisc-Vの命令表を作ろうと記事を書いていたのですが、東大の方がすでに良いものを公開してらっしゃったのと、書いている途中で消失し、やる気をなくしたのでやめました。そして前回の記事で作成した環境でバイナリの解析を行っていたところ、Risc-Vには疑似命令というものが存在し(別にPICにだってある)、命令とアセンブラが直交しないことがわかりました。コレはちょっと面倒くさいです。そこで逆アセンブラの開発を行い、結果としてRV32Iの命令を逆アセンブル出来るものが完成しました。逆アセンブル部分は完成したのですが、ELFヘッダとかがgccのバイナリにはついてるので、なんだか面倒臭くなっちゃってファイルを読み込んで逆アセンブルする機能は作らずにこんな中途半端な1命令逆アセンブラが完成しました。

アセンブラの開発を行ったもう一つ狙いとしてはエミュレータの命令デコーダと逆アセンブラ構造が大体一緒なので、逆アセンブラを改造したらエミュレータが出来るんじゃね?っという狙いがあります。今回のプロジェクトの最大の目標はFPGAへの実装ですから、エミュレータの開発はほぼ必須なので逆アセンブラ作ったのは悪くなかったと思います。でもさ、Twitter見てるとエミュ書かずに直接FC互換機と書いちゃう化物がいて怖いよね。

失敗したこと

アセンブラを作った当初は「逆アセンブラアセンブラは真逆の動きをするだけだから逆アセンブラ用のswitch文ツリーをそのままアセンブラに流用できんじゃね?」とかアホなことを考えていたのですが、アセンブラでは疑似命令が登場するのでちょっとむずかしいですね。はい

「お前進捗おくれてんじゃねぇか」

ごめんなさい自動車免許の合宿に行ってました。僕は高専技科大学の純粋培養ちゃんなので世の中色んな人が居るんだなと思いました。

Rsic-Vの開発環境の構築

Day1:Risc-Vの開発環境の構築を行ったメモです。

 エミュレータの開発を行おうにも正しいバイナリが存在しなければ動作させることができません、そこでRisc-V財団が提供しているRisc-Vのコンパイラをビルドしてみました。Risc-Vのコンパイラのビルド方法は公式ページを見ればかんたんにできると思います。ただRisc-Vのコンパイラはビルド時にアーキテクチャが指定できるのですがそのへんがややこしかったので、そのへんについて書きます。

Risc-Vにはご存知の通りたくさんのサブセットが存在します

  • I: 整数演算命令
  • M:整数乗算命令
  • A:アトミック(マルチコアのためのメモリ管理とかそのへん)
  • F:浮動小数
  • D:倍精度

この他にも色々あるけど、二進化十進表現みたいな銀行員しか使わないそうなサブセットもサポートしています。

 公式が提供しているコンパイラはビルド前のconfigureで必要なサブセットを指定できます。

./configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d

 例えば上記のように指定した場合、まず--prefixコンパイルしてできたバイナリを保存する場所でです。--with-arcはアーキテクチャを指定するオプションでrv32iにサブセットを書き足すことによって命令セットを指定するできます。例で登場するRV32GCというIMAFDを全部含んだ基本命令セットになります--with-abiはどうも小数点の扱いを指定できるようです。lip32を指定するとソフトfloat、lip32dを指定すると32bitハードfloatを利用が可能になります。

私は整数と乗算だけで良かったので、次のように指定してコンパイルを行いました。

./configure --prefix=/opt/riscv --with-arch=rv3im --with-abi=ilp32

 iが整数型の命令でmが乗算命令のサブセットです。浮動小数点はソフトウェアエミュレートで使うよう指定しビルドを行いました。今回の用途ではlinuxapiを使わない生バイナリを生成すればよかったので、

sudo make -j8

 と指定しました。sudoがあるのはmake時にファイルの配置まで行うからです。正直makeとmake install は別々にしてほしい。

するとコンパイル終盤あたりでエラーが発生してしまいました。エラーを見ると「rv3imなんて知らねぇよ」みたいなことが書いてありました。/opt/riscvを確認するとriscv32-unknown-elf-gccまでは生成できていました。そこでコンパイラに-Sオプションを指定してソースコードを食わすとそれっぽいアセンブラができていいました。

これは多分上位互換のアセンブラーにアセンブラファイルを食わせればうまく動くのではないかと考え、

./configure --prefix=/home/[ユーザー名]/riscv --with-arch=rv3gc

 でコンパイルを行い、そのなかの中身のbinopt/riscv/binにコピーしました。

そして次のMakefileのように指定してコンパイルするとちゃんとバイナリが出力されたんだよなぁ

CXX = /opt/riscv/bin/riscv32-unknown-elf-gcc 
AS = /opt/riscv/bin/riscv32-unknown-elf-as 

main: main.c
	$(CXX) -S main.c
	$(AS) main.s

まだ命令セットを把握しているわけじゃないからアセンブラ読んでもよくわからないんだけど足し算とか定数が見えるから、ちゃんと動いてんのかなコレ?

自作CPU上でセルフホスティングできる自作コンパイラを動かしたい

自作CPU上でセルフホスティングできる自作コンパイラを動かしたい

 知っている方は知っていると思うが、私は去年大学院入試で失敗し今年の前半は大学院浪人生活を送っていた、前半は浪人生として真面目に勉強していたのだが8月の院試に合格すると本格的にニートになってしまった。その後10月に語学留学にカナダを予定していたので、その対策を行ったりしていたのだが。二ヶ月後には語学留学も終わり本格的にやらなければ行けないことがなくなってしまった。

1月現在ニート生活もあと三ヶ月になった。現在英語の勉強をしたり大学院への準備としてニューラルネットワークの勉強をしたりしているわけであるが、かの有名な東京大学のCPU実験に触発されて自分でも似たようなことが前からやりたかったので、やることにした。もちろん、大学院ではハードウェアアクセラレーションの研究をするのでCPUの設計はもちろんコンパイラの作成も十分に役に立つのではないかと考えている。だたまぁ東京大学のCPU実験はグループでやる実験だし、私は東大生ほど賢くないのでどこまでできるかよくわからない。

やることの目標は次のようにした。

RISC-Vを選んだ理由は命令が単純でなんとなく流行っているからであり、就職のときネタにできるかなっていう軽いノリだけである。

C言語を選んだのはC言語を実装してしまえばC言語完全に理解したってネタが実際にできると思ったからである。ソンダケ

セルフホスティングを目的にしたのは自分の作ってCPU上でプログラムをコンパイルできれば、PCから独立した端末として成長できるということになり面白いと思ったからである。

やること

今回の計画でやることは次の通りである。

1.エミュレータの作成

コンパイラを作成する上で実行環境がなとテストを行えないので、まずはRISC-Vのアークてくちゃの理解も兼ねて実行環境の構築を行う、gcc等で生成したバイナリを使って動作確認を行う。

2.コンパイラの作成

エミュレータ上で動作するバイナリを出力できるコンパイラの開発を行う、東大のCPU実験のようにレイトレーシングを行うわけではないので、とりあえずちゃんと動作するバイナリを吐けるものを目指す。

3.OSの作成

セルフホスティングする際にファイルの読み込みやバイナリの出力、プログラムの実行等を行わなければ行けないためOSが必要になる。そのための機能を持ったOSが必要を用意する。できることならμCLinuxやMINIXが使えると面白そうなんだけどなぁ。

4.CPUの作成

RISC-VをFPGA上に実装する。正直あんまり作り込むつもりはないがパイプライン化くらいできるといいな程度に考えている。アウトオブオーダー等にはチャレンジしない。

5.セルフホスティング

エミュレータ上で作成した環境を実機上に移植しコンパイラを動作させ、プログラミングをおこなう

 

 

 

Gstreamer+OpenCVの環境構築

Gstreamer+OpenCVの環境構築

 今回ロボコンの大会に出場することになり、友人のPC上に私と同じ環境を構築する必要が発生したため、大会で使用するプログラムのための環境構築について親愛なるMRI氏のために解説する。
 ロボットを遠隔操縦する場合ロボットに搭載されたカメラの映像をネットワーク経由でストリーミングできると便利である。MJPG-streamer等の導入が容易なシステムも存在するが、GstreamerにはOpenCVと容易に連結し画像処理を行うことができ、H264が利用できるためRasberryPiのハードウェアエンコーダを利用したH264による高速高画質なストリーミングが行えるなど多くの利点が存在する。

環境構築

①Gstreamerのインストール

 OpenCVをビルドする前にGstreamerをインストールしておく必要がある。これは公式に従いUbuntuであれば次のように実行する。

 sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools 
OpenCVのダウンロード

 適当なディレクトリにOpenCVをダウンロードする。デバッグを行う際にエラーメッセージ内でOpenCVのライブラリを参照することがあるのでhomeにOpenCVというディレクトリを作っておくと良いかもしれない。今回はOpenCV3.4を利用することにする。

mkdir OpenCV
cd OpenCV
wget  https://jaist.dl.sourceforge.net/project/opencvlibrary/opencv-android/3.4.0/opencv-3.4.2-android-sdk.zip
unzip opencv-3.4.2.zip
OpenCVのcmake

 ダウンロードしたOpenCVのzipファイルを解凍し、解凍したディレクトリ内にbuildという名前のディレクトリを作成し中に移動する。
ここからが難関である。Gstreamerと競合するライブラリがあるとGstreamerが上手く動かなくなるので、競合するライブラリをすべて無効化しておく必要がある。

cd opencv-3.4.2
mkdir build
cmake -D CMAKE_BUILD_TYPE=RELEASE  -D  INSTALL_C_EXAMPLES=ON   -D WITH_1394=OFF -D WITH_GSTREAMER=ON -D WITH_FFMPEG=OFF -D WITH_QT=ON ..

重要なのは次の3つの項目である。

  1. WITH_1394=OFF
  2. WITH_FFMPEG=OFF
  3. WITH_GSTREAMER=ON

1つ目のWITH_1394はIEEE1394のことらしくカメラのインタフェースに関する項目であるがGstreamerと競合するようなので無効化する。2つ目のWITH_FFMPEGであるがこれはメディアフレームワークでありGstreamerと思いっきりキャラがかぶっているので無効化する。3つめのWITH_GSTREAMERであるが、これを有効化することでGSTREAMERが利用可能になる。

この設定でcmakeを行うと次のようなログが出力されるので確認してほしい。Video I/Oの項目でGstreamer以外にYESが無ければ成功である。もし上記の設定でcmakeを行い、YESの項目が存在すればここにcmakeのオプション一覧があるので、参照してYESになっている項目を無効化する。

--   Video I/O:
--     GStreamer:                   
--       base:                      YES (ver 1.8.3)
--       video:                     YES (ver 1.8.3)
--       app:                       YES (ver 1.8.3)
--       riff:                      YES (ver 1.8.3)
--       pbutils:                   YES (ver 1.8.3)
--     libv4l/libv4l2:              NO
--     v4l/v4l2:                    linux/videodev2.h
--     gPhoto2:                     NO
OpenCVのビルド

 OpenCVのビルドとインストールを行う。makeのスレッド数はコア数の倍程度が好ましいとされているが、RasberryPi3の場合は -j 4 程度にしておいたほうが無難である。

make -j 8 #8スレッド
sudo make install


以上で環境構築は終わりである。

使用例

 OpenCVにはこのGstreamerを利用するための拡張機能が存在し、VideoCaptureやVideoWriterを使ってGstreamerのパイプラインとOpenCVを連結することが可能である。

使用例としてgstreamerのテスト信号をキャプチャしOpenCVで表示するプログラムを掲載する。

gstreamer_test.cpp

#include <opencv2/opencv.hpp>

int main(int argc, char *argv[])
{
	cv::VideoCapture gstreamer;
	//gst-launchと同じコマンドを実行することができる。
	gstreamer.open("videotestsrc  ! appsink");                                 //カラーバー
	//	gstreamer.open("videotestsrc pattern=ball ! appsink");      //ボール
	//	gstreamer.open("videotestsrc pattern=snow ! appsink");   //じゃみじゃみ

	if (!gstreamer.isOpened()) 
	{
		printf("=ERR= fail to open\n");
		return -1;
	}

	while (1)
	{
		cv::Mat GstCap;
		gstreamer >> GstCap;
		cv::imshow("Gstreamer test", GstCap);

		int key = cv::waitKey(1);

		//’q’で終了
		if (key == 'q')
		{
			break;
		}
	}
	return 0;
}

コンパイル

g++ `pkg-config --cflags opencv`  gstreamer_test.cpp -std=c++11 -g `pkg-config --libs opencv` 

BINファイル-HEXファイル 変換ツール

mbedコンパイラのbinファイルをHexファイルに変換します

下のボタンを押しbinファイルを読み込むことでIntelHEXに変換され出力される。


 ダウンロード  

 LPC1114は安価で高性能で入門者にとても良いマイコンであり、mbedコンパイラを使って開発を行うことが出来る。

 mbedインターフェースを用いずFlashMagicを使って書き込みを行おうとした場合、どうしてもbinファイルをHEXファイルに変換する必要が発生する。このような場合HEXツールやBIN2HEX等のツールが用いられるが、前者は使い方がややこしく、後者は64ビット環境で動作位しない。このような環境依存の問題がややこしく感じたため、このツールを開発した。

なんか途中でファイル名の設定とかめんどくさくなったのでその辺適当

院試

自分の心の整理も兼ねて大学の院試の現状について書こうと思う、私が今年受験する大学は次の3つである。

 正直言って金沢大学はかなり厳しい気がする。現状の僕の学力では、専門はかろうじて解けるレベルだし、数学はかなり怪しいレベルである。金沢大学の先生が僕のことをかなり気に入ってくれているようなので中々複雑な心境である。

 NAISTに関して言えば院の学生とコネクションが出来たので、小論文を添削していただける事になりかなり有利に進められそうである。TOEICも585点でもそこまで悪い方では無いらしいし、小論文さえ良ければ大丈夫らしい、体感で「6割は行けるだろう」という感じがする。特に立地がのどかな上大阪日本橋にかなり近いということで非常に気に入っている。凄く行きたい。

 JAISTもとても良い大学であり高専時代はこの大学院へ専攻科から編入で進学しようと考えていたので受験することにした。興味のある研究分野もあるので受けることにした。行って後悔することは無いと思う。

 以上が僕の受ける大学である。できることであれば金沢大学へ進学したいところだが中々厳しそうである。現在の研究室の卒業研究を中途半端に進めて閉まっている現状なので、先生に土下座して院試の勉強とゼミだけさせてもらえるようにしたほうがいいかもしれない。

 とりあえずマクシミン戦略でNAISTJAISTを攻めて金沢へ広げていく感じで行こうと思う。

 万が一全部落ちてしまったら、卒業後研究生にでもなって、受験後に海外インターンシップでも行こうと考えている。というか考えてでもいないと心が潰れそうである。

 

 

「クジラの文化 竜の文明」大沢 昇

 以前神保町の古本市で三冊500円のまとめ売りで買った本である。

本のタイトルのクジラは日本のことであり、竜は中国のことである。

内容としては日米の文化の対比を歴史、文化、地理的要因、宗教、フォークロアなどの様々な側面から考察している本である。また中国と日本の類似性を語る上でアジア圏の文化と欧米文化との比較も登場する。

f:id:toriten1024:20170502173207j:plain

概要

一章 「顔」と「国の形」

 主に地理や歴史的な側面に関しての比較を行っている。国の成立の経緯や皇帝と天皇の違いなどについて詳しく解説している。最初は「日本鬼子」や「艦隊これくしょん」といったオタクカルチャーや日本から中国に流入した漢字の話から入り、それを起点に日本と中国の文化の根本的差異や類似点に関して話を広げていく。

 特に興味を引かれたのは皇帝に関する話である。私たちの日本の天皇は伝説上では神の血を引いていることになっており、血筋によって決められるものであるが、中国の皇帝は能力のある人間が選ばれるシステムであり、どのような身分の人間であっても運さえ良ければ皇帝になれたということである。そのせいか、天皇は位を子供に譲ることで退位するのがもっとも多いパターンであったようだが、皇帝が退位する要因としては一番が寿命や病死などによる退位、二番目が廃位、三番目が殺害であったという。

二章「水の文化」と「火の文明」

 機構的要因や生活様式から生じる、衣食住の文化に関する対比を行っている。タイトルの「水」と「火」という部分についててであるが、これはそれぞれの国においてのの浄化の象徴である。

 巨大な大陸にあり、大河が流れている中国における浄化の衝動は食べ物や水を消毒できる「火」であり、それが調理法などにも大きな影響を与えている。それに対し、細長い島国であり、中央の山脈から左右に短い川が流れている。かつて日本を訪れたオランダ人土木技術者も日本の川を見て「これは川でなく滝だ」といったという。このような短く水源から海までの距離の近い日本の川は淀むことがなく、常にきれいな水が手に入ったこのようなことから日本で「水に流す」という言葉があるように、日本における浄化の象徴は水であるという。

三章 どちらも現実主義だが

 国民性というか、国民の気質やものの考え方に関する対比を行っている。この章で私が面白いと感じたのは3節の”「縮みの志向」と「巨大願望」”である。簡単に言えば日本人は何でも小さく纏めてしまうことを好み、中国人は大きく巨大で壮大なものを好むというはなしである。

 このような傾向は建造物で顕著に現れており、中国の都市部へ行けば巨大な建物が沢山あるという、以前私は親戚に会うためにシンガポールを訪れた時に、多くの巨大なビルを目にし、度肝を抜かれた経験がある。日本にも都庁をはじめとする単純に大きい建造物は多数存在するのだが、それらとシンガポールの建物は空間のつくりがまったく異なっているのだ。巨大な吹き抜けやマリーナベイサンズのような一見無茶な建造物を多数みかけた、このような傾向はやはりシンガポールの経済の中枢を華僑が回していることが影響しているのだろう。

 また、本に登場するエピソードで、大学生として興味を惹かれるものに、こんな話があった。中国からきた留学生が日本の大学で研究テーマを決めるとき大きく壮大なテーマを選ぼうとする。すると日本人の指導教官からダメだしをもらい、もっと小さなテーマを選ぶよう促される。その後中国に帰りかえり研究テーマを尋ねられて答えると、「わざわざ留学までして、そんな小さなテーマを扱ったのか」と文句を言われるのだという。このような一見文化と関係なさそうなアカデミックな領域まで国民性が関与してくるのは意外であった。

四章 明るい競争社会の裏側

 移動手段や文学や芸術に関しての対比が行われている。タイトルの意味は良く分からなかった。

 移動手段に関しては国土の性質が強く影響しており、中国の辞書では日本で言う「衣食住」の項目が「衣食住行」となっているのだと云う。比較し狭い面積でかつ細長い日本では東海道などに見られるよう徒歩による文化が発達し、縦横それぞれにとても広い国土をもつ中国では乗り物による移動の文化が発達したのだという。

 文学に関しては宗教の影響が強く影響している。古くより日本では仏教神道が信仰されており、幽霊が創作の題材に取り扱われる。これには日本の神道が単なる体系性をもった多神教ではなく、地域の特性を色濃く持つ土着宗教に近い性質を持っていたり、仏教に関してもかなりのローカライズがなされている、ことが影響しているのかもしれない、それに対し「儒教思想の支配が強い中国では孔子が人知の及ばないところに関しては語るべきでない」といっているように幽霊などは民の時代までは、あまり文学の題材として扱われることはなかったという。中国は欧米や日本と比べ創世に関するハッキリした伝承がないためフォークロアに関しても自由な発想のものが多く、孔子以前の古い民話や伝説が失われてしまっていると思うと少し残念である。

五章 「クジラの文化」と「竜の文明」

 タイトル回収の章である。日本がクジラ、中国が竜に例えた理由やそれに対する今後の展望にかんして書かれている。

 竜は欧米の伝説ではお姫様が竜にさらわれたり、黙示録の獣が竜であるように悪の化身として扱われるが、中国では神聖なものとして崇められ、中国人は自分たちは竜の血を引くと自称するという。筆者は中国の竜の特徴は様々な生き物の特徴の複合であることを挙げている。竜の頭は麒麟にており、鹿に似た角と、鯉に似た髭を持つなどのキメラ的特長を持つ、このことから他民族が入り混じり多数の文化が組み合わさった中国の文化との類似性なども含め中国を竜の文明としている。

 それに対し、日本の象徴としてクジラを挙げている、日本の文化として紀元前よりクジラを食べる文化を持ち、鯨の肉から、髭、内臓に至るまで余すことなく使い、クジラを弔う「青海島鯨墓」があるなど、鯨が日本文化に密着していること、中国と近すぎず離れすぎず独自に進化したことなどを挙げ日本をクジラの文化としてる。

感想

 まず購入したときの値段に対してかなり楽しめる本だったので満足していることを書いておきたい、中古なので筆者にお金がまわらない事を少し申し訳なく思う。

 私は以前よりエンジニアとして東洋のシリコンバレーと呼ばれる「シンセン」対し強い憧れを持っていたので中国に興味はあったのだが、技術的な側面でしか見ていなかった中国に対し様々な側面で見識を深めることができた。

 エンジニアとして興味を惹かれたものに「落」という概念があった。中国には「盗」と「落」とう二つの概念があり、「盗」は盗みで罪であるが、自分の仕事場のものを少し持ち帰って使うことは「落」にあたり、罪ではないということである。聞く話によるとシンセンのジャンク屋に行くとiPhoneのCPUなどが平然と売られているという、iPhoneの製造は中国のFoxConの工場で行われているというが、こういった部品が流出している事態も「落」に当たるのかと考えてしまった。