2013/07/22

glibc の関数の引数の数について調べてみた

Open Design Computer Project で作っている mist32 プロセッサの、関数呼び出し規則と割り込みについて考えてる間に、あるひとつの疑問が...

ふつうの関数は、どれぐらいの引数を使うのか

平均と言うよりは、最大でどれぐらいまでの引数が使われることが普通なのか。

何故こんなデータが欲しいかというと、関数呼び出し規則 (Calling conventions) でレジスタに引数を乗せることは確定だが、どの程度引数レジスタを用意すればいいのか、という事を決めたい。

関数呼び出し規則では、レジスタに呼び出し元か呼び出し先か、どちらで保存するかを定義しなければならない。基本的には、呼び出し先保存 (caller-saved) なレジスタの方が、効率が良いのである。実際に使われたレジスタしか退避することがないから。

全部引数に載せればいいじゃん?って思うかもしれないけど、レジスタが許す限り全部引数をレジスタに乗せることに決めた場合、すべてのレジスタが呼び出し元保存 (callee saved) なレジスタになるので、問題が起きる。呼び出した先の関数がどのレジスタを使ってるのかなどわからないので、呼び出し元の関数で使ってる変数レジスタをすべて退避する必要がある。その先の関数でそれを使っていないかもしれないのに。また、割り込みの際にも、呼び出し元保存のレジスタは、基本的に割り込みハンドラで保存しなければいけないし、多すぎるといいことはない。

つまり、どの程度の数の引数が一般的に使われるかがわかれば、ほとんどの数の引数をレジスタ渡しで実現しつつ、無駄なレジスタ退避を少なくすることができる、理想の引数レジスタの個数をなんとなく予測することができる。

2013/07/18

エンディアン変換とバイトアクセス

最近、Open Design Computer Project で mist32 プロセッサのシミュレーターを作っています。I/O のエミュレーションにもある程度対応してます。
https://github.com/techno/mist32-simulator

そこで気づいたことをひとつ書こうかなと。あたりまえのことなのですが。

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

ご存知の通り、この世のコンピューターは内部的にエンディアンやバイトオーダーと言われるような、1ワードのバイト列をどのようにメモリ上に配置するか、という手法が大きく分けると2つあります。

Data: 0x1234ABCD

                0  1  2  3
Big Endian:    12 34 AB CD
Little Endian: CD AB 34 12

上記が、ビッグエンディアンとリトルエンディアンの概要です。ビッグエンディアンの方が人間には自然に見えますが、コンピューター的にはそうでない面もあり、一長一短です。一般的に使われている x86 はリトルエンディアンを使っています。

ファイルシステムや、ネットワークプロトコルなどによって、エンディアンは普通は規定されています。(FAT はリトルエンディアン、ネットワークはビッグエンディアン) しかしながら、ELF のようなメモリイメージのようなフォーマットは、そう簡単に行きません。

2013/07/16

Debian で起動時に NFS マウントが詰まる問題

某所で運用しているシステムで、Debian squeeze で HA 化されたストレージに対して、起動時に NFS マウントしています。

/etc/fstab の記述はこんなかんじです。
192.168.0.xxx:/nfs/var/www /var/www nfs rw,hard,intr,rsize=8192,wsize=8192 0 0

ところが、起動時に "Waiting for /var/www..." で詰まって、タイムアウトするまでブートシーケンスが止まる、しかも結局マウントされない、という問題が起きてました。しかしながら、起動した後 mount -a すると正常にマウントされます...

/var/www がマウントされないと、その後の apache の起動もコケるので、非常に良くない状況です。再起動するたびに、手動でマウントするようなことはしていられません...

原因を探ってみたところ、起動時に nfs のマウントを司っているのは、/etc/init.d/mountnfs.sh だという事がわかりました。このファイルを辿って行くと、"$ASYNCMOUNTNFS" という変数を見て、do_wait_async_mount に飛ぶか飛ばないかを見ているようです。どうもこいつが怪しそうです。

結局以下のコマンドを打ったら、現象は再現しなくなりました。根本的な原因はよくわかりませんが、まあいいかなと...
`echo "ASYNCMOUNTNFS=no" >> /etc/default/rcS`

2013/06/04

LinuxCon Japan 2013 へ行ってきた

今年も LinuxCon Japan へ行って来ました。Student であれば first50 が参加費免除という、去年と同じパターンです。こういうカンファレンスに、学生であれば優遇して参加できるというのはいいことですね。

去年は、割と軽い気持ちで参加したのですが、今年は研究室でカーネルをいじったりストレージやメモリ周りの話をしているので、割と本格的に話を聞きに行きました。

プレゼンテーションはこちらにアップロードされてるみたいです

Cloud Open が併設ということで、Keynote も公演も、仮想化・クラウドの話が多かったですね。あと、リアル Linus の話を初めて聞くことができました、いつもの調子で結構ぶっちゃけてました。

ストレージとかメモリ周りの話を重点的に、Intel の CPU hotplug の話とか、Google の RedHat から Debian にダイナミック移行の話だとか、少し KVM の話も聞いたりしてました。英語ついていくの大変でしたけど、とても面白かったので、来年も行けたらいいな、とか。というか、毎年 Student Presentation があるので、来年こそはなんか成果を発表できたりしたらいいですね...

最後に、会場が椿山荘という場所だったのですが、庭園が綺麗でした。昼休みに、庭園と神田川沿いを散歩したりしてました。去年のみなとみらいもそうでしたが、休み時間にそとをぶらぶらして楽しめる立地というのは、時間が無駄にならないですし、海外から来てる人にとっても、嬉しいだろうなーという。よく考えられてますね、偶然かもしれないけど。

2013/05/14

自炊 PDF を Kobo Touch 向けに ImageMagick で変換してみる

最近このおもちゃを手に入れました。Kobo Touch です。
http://kobo.rakuten.co.jp/

当たり前のように、買ったのではなく、キャンペーンでもらいました。貰わなくても、そこら中で投げ売りされてるわけですが、タダより安いものはないです。もちろん、もらうには理由があって、最近研究室関連で本を読んだり論文を読んだりすることが多いので、活用してます。

そんなわけで、まずはあんなことやこんなことをしないで、正常に使ってみます。しかしながら、少し使ってみた感じとしては、(定価では)同じような値段で売っている Kindle Paperwhite に勝るところはたぶん無いと思います。バックライトついてないと、暗いところだと辛いですね。

 さて、早速 ScanSnap で自炊されている本を入れてみたのですが、縦横比の問題とか余白が大きすぎて、そのままでは綺麗に見るのは難しそうです。世の中には、Windows 向けに自炊したものを変換してくれるものもあるみたいですが (ChainLP など)、手元に Windows もないので ImageMagick とかを使ってうまく行かないか試してみます。

2013/04/21

ビックリバコ株式会社でお世話になった皆様へ


突然なのですが、そろそろ?この会社の開発から退くことにしました。
(そもそも、肩書きは飾りで、お手伝いさんだったけど...)

まず、僕を開発に誘ってくれたよぴた (吉田有花/CEO) に感謝します。
彼女の「夢は笑顔テロで世界征服。」に、惹かれて、彼女の足りない部分を補ったらなんかできるのではないかと思い、手伝うことにした、半年前。
僕も時間に余裕があり、一度はこういう体験をしてみるのもありかなと思っていました。

まあ、当初とは様々な環境の変化があり、創業時に考えていた負担割合以上に、半年間努力してきました。
しかしながら、4月から研究室に配属されてそちらに集中したいのと、Open Design Computer Project にもっと時間を費やしたいと思いました。そして、僕がお手伝いとして、この会社に貢献できることが、中途半端になってきたというのもあり、区切りがつきました。
最初から4月までで一区切りつける予定だったので。やっぱり区切りつけようと思ったのが数日前。

具体的には、資金と時間、技術も含めて様々なものが足りずに、自分が必死に作ったもの完成目前で実質お蔵入りしてしまったので、一番プログラマーとしては、大きなダメージでした。それと、必死になっていたのも、ある理由(非常に重要)があったからなのですが、その問題が解消されつつあるというのも、安心してこうできる理由の1つです。

なので、僕自身いろいろ一度リセットします。
こんなこと公開しないほうが良いかもしれませんが、けじめです。けじめ。

ビックリバコ株式会社は、これからも、僕が少し?鍛え上げたよぴたが続けていきますので、よろしくお願いします。また、現在進行中のものはお手伝いを続けますし、完全に抜けるわけではなく、面白いものが出てきたら、また手伝うつもりです。
少し自分勝手なような気もしますけど、よぴたも納得してくれたので頑張ります!

よぴたの、よくわからないあの雰囲気があれば、箱からビックリするものが、いつかは出てくるはずです。
受託ばっかり続けてちゃダメなんだからね!
http://bicly.net/

2013/02/04

Linux から L2TP/IPsec で VPN

最近、Softether が開発している PacketixVPN 4.0 に、L2TP, OpenVPN, MS-SSTP が対応して、その界隈ではとても熱い感じです。
おかげで、様々なクライアントから特別なソフトウェアの導入なしにつなげるようになったことで、夢が広がります。
まだ、ベータ版というか、RC1 の状態ですが、ダウンロードして試すことができます。

クライアントから、手軽に L2TP/IPsec したいよね?

そんなわけで、Linux からも L2TP/IPsec で VPN したいわけです、しかも手軽に。
クライアントからつなぐ際、PPTP とか OpenVPN であれば、NetworkManager が対応しているわけなんですけど、L2TP/IPsec は StrongSwan が対応しているようで、なんかうまくいきません。
(少なくとも PSK, 事前共有鍵 を使った接続はできなさそうだった)

設定ファイルをぽちぽちいじるのも、なんか前世代的で面倒です。
それに、結構色々設定しなきゃいけません。

l2tp-ipsec-vpn を使ってみる


色々探してみたのですが、OpenSwan をバックエンドとして使う l2tp-ipsec-vpn を使うのが良さそうです。
これなら、GUI からぽちぽち設定してつなぐことができます。PSK にも対応してます。

Debian (wheezy 以降) や Ubuntu であれば、以下のようにしてインストールするだけです。
sudo apt-get install l2tp-ipsec-vpn
メニューから GUI のプログラムをたちあげると、上記のような設定画面が出てくると思います。

設定とか

接続の設定画面はこんな感じですね。
"Use pre-shared key for authentication" の部分に PSK (事前共有鍵) を入力します。

今回の接続先の、Packetix VPN の L2TP/IPsec は PAP にしか対応していませんので、PPP タブに移って、"Allow these protocols" を選択して PAP にチェック入れた後、"User name" と "Password" を入力します。

それと、"IP Settings" の中の "Obtain DNS server addresses automatically" にチェックを入れておきましょう。
これにチェックを入れないと繋がらないかもしれません。
または、DNS サーバーのアドレスを手動入力しましょう。

設定が終わったら、GNOME3 であれば、右下のタスクバーみたいなところに l2tp-ipsec-vpn が常駐しているはずなので、設定名をクリックするとつながります。

初期設定は、VPN を貼ったネットワークがデフォルトゲートウェイになるので、設定を変更したい場合は "IP Settings" -> "Routes..." で設定しましょう。

Linux でも割と手軽に、L2TP/IPsec で VPN を張ることができました。
接続先も Packetix VPN を使えば、とても簡単に設置することができるので、良い時代になりましたね...