x86-64

とりあえずNICをポーリングしたらレイテンシどのくらい縮められるか実験するために、QO3ひっぱり出してきたが、x86-64対応途中でやめてたのをなんとかした。
あとgithubにおいた。
https://github.com/tanakamura/qo3


QO3がなんなのかというと、↓にも書いたが、
http://d.hatena.ne.jp/tanakmura/20100112#1263231732

今のPCでOS無しだとどういう性能になるかを調べたくて、PC上のOS無しドライバみたいなのを作りたかったんだよね。そして、その知見をもとにして、最強のOSをつくる予定だった。まあでもそういう最強OS作る的な若い心は失われたので多分やらないけど…


使いかたは…まあNICのが終わったら書こう。


で、x86-64対応ができた。

x86-64は、ページング必須だというのがわかって萎えたのと、なんか難しかったのでやめてたのだが、古いコードをもう一回修正するのも嫌だったので、やりかけてたのを終わらせた。

http://d.hatena.ne.jp/tanakmura/20100114#1263428111
多分このへんが途中だったと思うので、3年越しの変更だし、36人月かかってると言える。


ページングまわりは、AMDのドキュメントのほうがちゃんと図が入ってて見やすい気がするので、そっちを参照したほうがいい気がするね…

http://developer.amd.com/resources/documentation-articles/developer-guides-manuals/AMD64 Architecture Programmer’s Manual Volume 2: System Programming 。


なんか説明書く気力が出ないのでざーっと書いてしまうが、やることは、

  1. ちゃんとページテーブルつくる
  2. PAEを有効に
  3. LME を 1 にして、Long Modeに入る
  4. ページングを有効にする
  5. 64bitフラグを立てたセグメントディスクリプタを用意して
  6. そこへロングジャンプ

1,2,3,4をやってるのが、https://github.com/tanakamura/qo3/blob/master/kernel/enable64.inc で、ページテーブルの作りかたは、http://www.returninfinity.com/pure64.html を参考にした。つまり、上から64GiB分、物理仮想で同じアドレスがマップされるようになってる。
Pure64というと、今回の計測環境としては、 http://www.returninfinity.com/baremetal.html でもよかった、というか、これなら、Intel 82574のドライバもあるから、実験の幅が広がるのだけど、中身が、IDEレジスタ直接読むようになってて、HDDをいっこ潰す以外の選択肢が無かったのでやめた。(QO3はmutiboot対応なので、ファイルつくって、ext2に置いて、GRUBから開けばそのまま使える)

5. は…忘れた。どっかでなんかやってる。6. は https://github.com/tanakamura/qo3/blob/master/kernel/boot.s#L142。 なんか後ろでごちゃごちゃやってるのは、なんかbochsのアサートにひっかかってよくわからんかったので入れたが結局アサート消えなかったので意味無い。


あと割りこみが変わる、が、3年前のできごとなのであんま覚えてない…まあ、書いたとしても多分上のリンクのAMDのドキュメントのほうが読みやすいと思うのでそれの8.9参照。


あと、いくらか動かなくなってる。前のバージョンはマルチコアとイーサネット動いてたが、なんか動かなくなってる。まあそのうち。


というわけで、今からRTL8169をポーリングしてpingに反応するドライバ書くから、みんなどのぐらいのレイテンシになるか予想してみるといいですよ?もしくは僕のかわりに誰かやってくれると僕が明日休めるので助かる。
まあ、送信側がLinuxだと意味ないので送信側も作らないといけないのだけど…


http://www.slideshare.net/miyox/google-20130218
これによるとFPGAが61usecと書いてあるが、そのぐらいなら出る気がするんだよな…多分。まあ、どこからどこで測ったかわからないのでなんとも言えないが。