10/31 (木)
[Compiler] 素晴らしき哉 Sun Forte C/C++ Compiler 6.0
昨日の続き。
SPARC/Solaris 上のプログラムのデバッグのために、ストア命令→ロード命令の逆転現象を防止するコードを挿入することにした。
このようなシリアル化は、volatile
を使っても C / C++ 言語の仕様内では書けないので、インラインアセンブラを使うことになる。
やりたいのは以下のようなこと。
1: *p = v; 2: asm( "membar" ); 3: if (flag) { 4: // 5: }
まず最初に引っかかたのは、インラインアセンブラが SPARC のバージョンの違いをきっちり認識して妙なエラーを出して止まってくれること。
SPARC のメモリバリア命令 membar
は SPARC V9 になって入って来た命令のようで、SPARC V8 まではストア命令のみを stbar
しかなかった模様。
この時期になっても、Forte C/C++ Compiler 6.0 は特別なコンパイラオプション(-xarch=v8plus
)を指定しないと V9 命令を生成してくれない。
次に引っかかたのは、いくら stbar
をインラインアセンブラで書いても、出力されたオブジェクトコード中に stbar
命令が
出現しないこと。
散々 調べた結果分かったことは、Forte C/C++ Compiler は例えインラインアセンブラで書かれたコードであっても、きっちり最適化をほどこしてくれるということ。
次のように、同一の命令を複数並べるとデッドコード削除最適化を行ってくれる。
asm( "ld [%g2 + 10], %g3" ); asm( "ld [%g2 + 10], %g3" );
困ったことに、 Forte C/C++ Compiler は stbar
命令も最適化して削除してしまう。
コンパイラは不要に見えるのかもしれないが、わざわざ書いたのだから必要なのだ。
最適化が強力なのはいいのだが、部分的に抑制する方法はないものか?
10/30 (水)
[Prog] メモリ・オーダリングについての覚え書き
OS の用意する同期オブジェクトを使わずに排他制御機構や例外処理機構を手で書いていると、色々悩ましい問題が発生する。 Memory ordering の問題だ。
現代のプロセッサは、内部にストアバッファとよばれる数ワードの1種のキャッシュ機構を持ち、ロード命令やストア命令などのメモリアクセスの実行順序を入れ替える最適化を行なっている(*1)。
その結果、メモリアクセス命令が発行された順序と、メモリバスへ読みこみに行く順序が変わっている。
Memory ordering は、どのような入れ替えを許し、どのような入れ替えを禁じるかという規則だ。
普通のプログラマは、メモリアクセス命令を実行した順に、結果が書き戻される Strong Ordering とか Program Ordering とか Sequential Ordering と呼ばれる memory ordering を期待しているが、そううまくはいかない。
問題が発覚したのは以下のようなコード。
1: extern bool flag ; 2: 3: *p = v; 4: 5: if (flag) { 7: // 8: }
このプログラムでは、条件によって 3行目の *p = v
でわざと不正なメモリアクセス例外を発生させ、シグナルをキャッチする。
そして、シグナルハンドラ内の条件によって flag
を true にし、元のコード位置に通知することを意図している。
ところが C / C++ コンパイラの最適化やプロセッサの memory ordering が絡んで、このプログラムが正しく動かない。 ここではコンパイラはプログラムの並び通りのコードを出力するとしても、このコードは動かない可能性が高い。
実際に症状が出たのは SPARC/Solaris 環境。 この環境では Total Store Ordering (TSO)と呼ばれる memory ordering が適用される。 TSO は以下のようなルールを持っている。
- ロード命令は、先に発行されたロード命令を追い抜けない。
- ストア命令は、先に発行されたロード命令&ストア命令を追い抜けない。
- アトミック命令は、先に発行されたロード命令&ストア命令を追い抜けない。
つまり、
ロード命令は先に発行されたストア命令を追い抜いぬくことが許されている。
そのため 3行目のポインタへの書き込みが行なわれる前に、5 行目の flag 変数の読み込みが行なわれる危険性がある。
このバグも微妙なタイミングに依存するので、シングルプロセッサやデュアルプロセッサマシンでは問題ないのだが、
16-way の SMP マシン上で動かして初めて発症した。
さらに問題なのは、異なるアーキテクチャのプロセッサでは、SPARC の TSO とは異なる memory ordering を持っていて、strong ordering 以外にはこれが標準と呼べるような memory ordering がないことである。
Intel のプロセッサだと、i486 と Pentium は TSO に似た Processor Ordering を採用している(正確にはロード命令がストア命令を追い越せるかどうかに、キャッシュのヒット・ミスヒットがからんできている)。
しかし、P6 ファミリ(Pentim PRO 〜 Pentium III)と Pentium4 では、Pentium とは異なる processor ordering を採用したため、以下のように微妙に挙動が変わってしまった。
- ロード命令は、先に発行されたロード命令を追い抜いてもよい。
- ロード命令はストア命令を追い抜いてもよい(ただしプログラムの実行は正しくなるように保証すること)。
- ストア命令はストア命令を追い越せない。
- シリアライズ命令(アトミック命令・メモリバリア命令)はロード・ストア命令をシリアライズ化する。
同一セマンティクスのプログラムが、プロセッサによって挙動が異なると言うのは、トホホな感じだ。
(*1)
ここで言うメモリアクセス順序の入れ替えは、メモリアドレスが異なり重なる部分がないアクセスを対象としたもの。
同一プロセッサが行う同一のアドレスに対するメモリアクセス順序は、どんなに緩い memory ordering でも保証される。
*p = a;
pause();
b = *p;
assert (a == b);
さえもあやしいということになってしまいませんか?
確かに例題のプログラムだとmemory orderingは関係ないですね。
実際に問題を起こしたコードはアセンブラレベルで確認して確かにmemory orderingが原因だった記憶があるのですが、簡略化したサンプルを作るうちに変わってしまったのだと思います。
ただどういう問題だったかすでに記憶があやふやで思い出せません。
10/29 (火)
大原雄介氏の MPF2002 レポート
MYCOM PC WEB で、大原雄介氏の Microprocessor Form 2002 のレポート記事が追加されていた。
Samsung の 6ステージの ARM1020E ベースのプロセッサが 1.2GHz で動くというのは凄い。
参考
- MPF2002レポート
- 非x86関連もチェック(1)-10億トランジスタの使い道とYukon
- 非x86関連もチェック(2)-65nmプロセスを目指す東芝とARM11プロセッサ第1弾
- 非x86関連もチェック(3)-400MHzプロセッサを3倍速で動かすSamsungのHalla
富士通の 2002年度 9月期の中間連結決算は?
最終損益が1474億の赤字ですた。
棒茄子ってなんですか?
食べれるものですか?
参考
10/28 (月)
ショッキングピンクとはこういう色に違いない
いささかショックなことがあった。
先月から書き進めてきた特許案件に、完全な先行実施例があったのだ。トホホ。
掲載されていたのは 2001 年の SUN Lab. の Techinical Journal。
問題が同じなら対抗策も同じようなところに落ち着くのは当然。
皆な考えることは同じか。。。
あと覚え書き。 現行の負荷分散装置の中にはアプリケーション層、特に Web の URL やクッキーの内容を見てスイッチをしてくれるものがある。 例えばここ。
10/27 (日)
[MyWeb] Web を更新
日頃の睡眠不足が祟って、昨日・今日ともに寝て過ごす。
「不正アクセスの発信地の国別統計をとろう!」のページを追加。
SPECcpu2000 にみるプロセッサの性能のページも更新。
Pentium4 は SPECint2000 値 1,000 を突破した。
10/25 (金)
[Java] Java SDK の比較を行おうと...
現在、商用レベルの x86/Windows 用 JavaVM を SUN、IBM、BEA が公開している。
とある理由で JavaVM 間の性能比較を行うことになり、各社の JDK を集めることになった。
Javaはクラスライブラリの仕様によって世代が存在する。
現在は、1.3 系(1.3.1が最新)と 1.4系(1.4.1が最新)の両方が利用されている状況である。
各社の JDK の入手先をまとめると下のようになる。
1.3 | 1.4 | |
---|---|---|
SUN | Java2 SDK SE v1.3.1 | Java2 SDK SE v1.4.1 |
IBM |
1.3.0
JDK 1.3.1 IBM WebSphere SDK for Web Services その他 |
(Windows用はない) |
BEA | WebLogic JRockit 7.0(1.3、1.4に両対応) |
問題は IBM の JDK で、1.3.0 の時は JDK 単体での配布を行っていたが、1.3.1 になってから WebSphere SDK(WSDK)という 100MB 近いキットを落さなければならなくなった(Linux 版の 1.3.1 は今でも単体配布している)。
どうも SUN から横槍が入ったという噂を。。。(以下略)
10/24 (木)
ADSL ルータのファームウェアを上げると
プロバイダの都合で IP アドレスが変わった。
この機会を捕えて、メルコの無線LANステーション機能付き ADSL ルータ WLAR-L11-L のファームウェアをアップロードした。
新しいバージョンでは、NTP による自動時刻設定機能と、syslog 出力機能が使えるようになった。
特に syslog 出力機能によって、ADSL ルータによってフィルタリングされた中→外、外→中へのアクセスが逐次 記録できるのが嬉しい。
今日、一日分の記録を調べてみると 137/udp への外→内への アクセスが、洪水のように行われていた。
最初、137/udp は NETBIOS のネームサービスなので、同じプロバイダにつながっているホストからの垂れ流しパケットかと思ったがさにあらず。
アクセス数で言うと英国(UK) 43%、ニュージランド(NL) 19% と国外からのアクセスである。
IP を付け替えたばかりのはずなのだが、早々からの手厚い歓迎である。
備考: 12/16
syslogd サーバーが他のホストからのログを受けつけるようにするには、syslogd -r
と -r
オプションが必要。
VineLinux の場合、/etc/sysconfig/syslog
に以下のように指定を加えれば OK。
#SYSLOGD_OPTIONS="-m 0" SYSLOGD_OPTIONS="-m 0 -r"
10/23 (水)
SSH2 端末ソフト for Windows
Windows 用の SSH クライアントソフトとしては、T. Teranishi 氏のTera Term Pro に、プラグインの形で実装された Robert O'Callahan 氏の TTSSH が有名である。
ただし TTSSH は SSH2 プロトコルを使ってくれないため、SSH2 サーバーしか立ち上げていないサイトにはアクセスできない。
そこで、SSH2 プロトコルに対応している SSH 端末ソフトが必要になる。
- SSHc Secure Shell
本家 SSH の端末ソフト。 日本語には対応していないようだ。
- TeraTerm Pro Web
TeraTerm Pro をベースに Ayera 社が SSH2 に対応を行ったもの。 フリーソフトである。
日本語は通るようである。
-
PuTTY
Simon Tatham 氏が開発した SSH 端末ソフト。 scp や sftp 機能にも対応のようだ。
hdk氏が日本語化パッチを開発・公開している
- Cygwin
OpenSSH ベースの SSH端末ソフト。
日本語対応は分からない。
すでに TTSSH を使っている人は、2. の TeraTerm Pro Web に乗り換えるのが良いと思われる。
10/22 (火)
続・不正アクセスはどこから?
昨日の続き。
ここ二月分の http サーバと smtp サーバへ対する不正アクセスを集計してみた。
サーバーのアクセスホスト(IP)数別、アクセス数別のランキングである。
|
|
アクセスホスト、アクセス数ともに韓国が圧倒的に多い。
以外なのはアクセス数 第2のインド。
ホスト数では 5位の 4.0% に留まるにのに対して、アクセス数の 11% と大活躍である。
集計したホストは、jp ドメインを持ち、日本に割りふられた IP 内にあるのにも拘わらず、日本からの不正アクセスはホスト数順で第9位、
アクセス数順で 8 位と奮わない。
是非とも次回はメダルを狙って欲しいものである。
10/21 (月)
不正アクセスはどこから?
サーバーを立てていると、
外部からいろいろ不正なアクセスを掛けてくる輩がいる。
この不正アクセスの IP アドレスが履歴中に残るのだが、この IP アドレスから攻撃がどこから行われたのか確かめたいと思う。
簡単な方法は、IP アドレスの逆引で得られたドメインから国を推測する方法である。 しかしこの方法は逆引ができないサイトや、得られたドメイン名から国が推測できない場合が多い。
そこで、各国に割り振られた IP アドレスから直接 検索を行う方法を考えた。
IP アドレスは IANA が管理し、地域を担当する Network Informantion Center (NIC) に IP アドレスを割り当て、地域 NIC が各国の NIC に IP アドレスを割り当てている。
現在、このような地域 NIC がアメリカ、ヨーロッパ、アジアの 3 つ存在するので、この 3 つの組織が公開しているIP アドレスの割り当てリストを手に入れ、結合すればよい。
と、書くのは簡単なのだが、各組織の Web ページのどこにどこに一覧があるのか探すのに苦労した。
下記の "allocation and assignmentports" にリストが存在する。
3 つのリストをまとめるとこのようになる[テキスト(479K)](圧縮ファイル[ZIPファイル(100K)])。
実際にどこから、アクセスがやってくるかは明日確かめる。
参照
- IPv4 のアドレススペース ... IPv4 のアドレス空間の使い方が 2^24個づつ記載されている
- 国別トップドメインの一覧 ... JP などの 2 文字の国別トップドメイン(ccTLD) の一覧
- IANA ... ドメインネームと IP アドレスの管理の総本山
- ARIN(allocation and assignmentreports) ... アメリカ方面に割り振られた IP アドレスを管理している組織
- APNIC(allocation and assignment reports) ... アジアに割り振られた IP アドレスを管理している組織
- RIPE(allocation and assignment reports) ... ヨーロッパに割り振られた IP アドレスを管理している組織
10/20 (日)
会社見学
友人 takano 氏の勤める某社の見学にゆく。
某社は医療系ソフトウェアの開発を行っており、IA-32 (Windows) ベースで CT スキャン等のデータをボリュームレンダリングするソフトが主力商品である。
いろいろ話を聞くが、ここにはちょっと書けない。
とりあえず、自分も研究にかまけずに、まじめに商品開発をせねばならんなぁと考えさせられた。
10/19 (土)
Proftpd で FTP のみのユーザーを設定する
ftp サーバーにアクセスだけできる仮想的なユーザーを作る方法を探していた。
この FTP only ユーザーは自分のホームディレクトリを設けず、anonymous ftp で公開されているディレクトリの下のみを読みこめる制限されたユーザーとする。
proftpd では、UserPassword を用いることで可能だということが分かった。
user1 user2 をこのようなユーザーとすると、パスワードなしでのログインを可能にするためには下記のように設定すればよい(user1、user2 は /etc/passwd への登録は不要)。
user1 user2 のログインにパスワードを要求するには、# 部分をコメントアウトする。
この時、ログインパスワードは crypt() の形式に合わせてセットする必要がある。
<Anonymous /home/anonymous> User ftp Group nobody UserAlias user1 ftp UserAlias user2 ftp # AnonRequirePassword on # RequireValidShell off # UserPassword user1 $1$mT79SdzS$0MmStE9/89fxLr0swuCan0 # UserPassword user2 $1$IlrBI9ck$bD789M6IPppow4a3IurzG. </Anonymous>
参考
10/18 (金)
[MyWeb] Boehm GC のページを更新
誰からも期待されていないが、Boehm GC のページを更新した。
当初、考えていたよりも Boehm GC は頑強(robust) であるようで、ポインタがオブジェクトの先頭ではなく内部を指している場合でも、オブジェクトに対する参照があると判断して正しくマーキングしてくれるようだ。
どこまで、有効かもう少し大きめのアプリケーションで評価を行ってみたい。
10/17 (木)
[Tips] Apache Web サーバでエラーに対応した HTML を表示する方法
Apache Web サーバで、特定のディレクトリの下でエラーとなった場合に応答メッセージを返すやり方を調べた。
応答は、ローカルまたは外部の URL を返す、単純なメッセージを表示する、CGI を起動するなどの方法が取れる。
http.conf の内容は以下になった。
<Directory /home/www/html/hoge/cgi-bin> ErrorDocument 401 http://www.hoge.mog/err401.html # 認証に失敗した場合 ErrorDocument 403 /home/www/html/hoge/err403.html # ホスト制限に失敗した場合 ErrorDocument 404 "404 Not Found URL" # URL が見つからない場合 ErrorDocument 500 /cgi-bin/error.cgi # 内部エラーが発生した場合 </Directory>
参考
10/16 (水)
[CPU] SPARC 系チップに関する覚え書き
早くも書き忘れたこの日記。 書くことも無かったのだが、しょうがないので無駄話をしてみる。
David A. Patterson 教授の RISC I の流れを組むSPARC アーキテクチャチップは、1991年に SUN が設計し富士通が製造した。 その後、SUN の開発する SPARC チップは SuperSPARC → MicroSPARC → UltraSPARC というように進んで行き、SUN 以外でも富士通、Weitek 社、ROSS 社、BridgePoint 社、T.sqware 社、HAL 研究所などが設計・開発等を行った。 しかし、現在 SPARC チップを開発・製造しているのは最初の SUN と 富士通だけになってしまった。
チップの開発については、富士通は 1350MHz の SPARC 64V で Alpha 21264C、POWER4 と同クラスの性能まで食い込んだ(SPARC 64系は out-of-order 実行を行っている)。 次期チップの開発も進んでいる。
一方、このところの SUN はやばい。
SUN のチップは out-of-order 実行ができないというアーキテクチャ上の弱点を抱えているのに、銅配線の UltraSPARC III Cu も 1050MHz で打ち止め状態。
そんな状態なのに次の UltraSPARC IV を出さないうちから、V、VI、VII の話だけが囁かれている。
参考
10/15 (火)
コンピュータビールス発生
浜松にいる友人 O 氏から電話がかかる。
彼の友人が題名が英語でいかにもあやしいメールをもらって困っているという話だった。
Outlook 使いだそうだが、賢明にもメールの本体を読み込まずにいたので、メールを読まずに捨てる方法があると説明した。
当方は、その手の怪しいメールが毎日くるので気にも留めないが、 普段 あまりメールをもらわない人にはやはり怖いらしい。
この話を聞いてから、数日前から気になっていたことを思い出した。
自前のメールサーバのログには、10/11 に別の友人 A 氏からメールが届いたという記録が残っていたのだが、そのメールを読んだ記憶がない。
削除メールの中を調べるとWORM_BUGBEAR.A付きのメールが発見された。
友人 A のノートパソコンはすでに感染のもようだ。
[Tips] SetEnvIf モジュールで Apache のログ管理
Apache のログ出力を効率化する設定をさがしていたのだが、ようやく望み通りの設定を得ることができた。
ログの方針は以下の通りである。
- Nimda などの明らかに攻撃を目標としたアクセスを worm_log に保存。
- 画像ファイルはログには残さない。
- グローバルアドレスからのアクセスを access_log に、
プライベートアドレス(10.*.*.*)からのアクセスを local_log に保存。
ログ出力のカスタマイズを行う CustomLogディレクティブは、HTTP リクエスト毎に環境変数が設定されている(またはされていない)ことを判断して出力することができる。
方針に合わせて環境変数を設定してやればよい。
条件の生成には SetEnvIfディレクティブを使う。
条件に合わせて環境変数を設定することができる。
SetEnvIf attribute regex env-variable[=value] [env-variable[=value]] ...
- attribute には Request_URI や Remote_Addr などの HTTP リクエストのヘッダーフィールドのを指定できる他、他の SetEnvIf(または SetEnvIfNoCase)で定義した環境変数が使える。 ただし、他のディレクティブ(SetEnvなど)で設定した環境変数はダメ。
- regexには、attribute の内容とマッチングさせるための正規表現を記述する。
- env-variableには設定した変更したい環境変数を列挙する。 指定方法は var (環境変数をただ定義)、!var (環境変数の定義を取り消す)、var=value (環境変数に値を定義する)の 3 種類がある。
http.conf の内容は以下になった。
SetEnvIf Remote_Addr \. dont_local_log SetEnvIf Remote_Addr ^10\. dont_access_log !dont_local_log SetEnvIf Request_URI "default\.ida|root\.exe|cmd\.exe" worm dont_local_log dont_access_log SetEnvIf Request_URI "\.(gif)|\.(xbm)|\.(png)" dont_local_log dont_access_log CustomLog logs/worm_log combined env=worm CustomLog logs/local_log combined env=!dont_local_log CustomLog logs/access_log combined env=!dont_access_log
参考
10/14 (月)
[CPU] 新しい PowerPC が発売される
この 3連休はほとんど無為に過ごした。
この無為さの原因を作った石のことについて書き留めておく。
- IBM PowerPC 970
- GPUL とか呼ばれた 64bit PowerPC。正式発表された。
プロセスルール 0.13μm で、52億トランジスタ相当。
2003 年に 1.8GHz から出荷される
- IBM PowerPC 750FX
- 組み込みをターゲットにした 32bit PowerPC。
こちらもプロセスルール 0.13μm。1GHz で 5W という低消費電力。
来年 1 月から 1GHz から出荷される。
- Motrola PowerPC 8500 G5
- 出るという噂しか聞かない謎の 64bit PowerPC チップ。
プロセスルール 0.13μm で製造。1.4GHz 時に 26W。
いつ出るかはまったく謎だ。
10/13 (日)
[Tips] OpenSSH + SOCKS5 が動いた
某所から外に出るのに SSH1(1.2.31) を SOCKS5 に対応させていたが、X プロトコル周りで問題が起きていた。 今回、OpenSSH thru SOCKS5のページを参考に OpenSSH 3.4p1 の SOCKS5 化をした。
はまった点としては、
- SOCKS5化した SSH1 の slogin はローカルのリゾルバを使っていた。
これを使って /etc/hosts に外部のホストのニックネームと IP を登録して、slogin <nickname>
と打って接続していた。
- OpenSSH から connect プログラムへのホスト名が直接渡される。 connect プログラムは SOCKS5 側のリゾルバで解決ネームの解決を行うとする。
この 2つの違いに気づかず、堂堂巡りをしていた。
追記:10/16
connect プログラムの使うリゾルバは -R オプションで指定できることが分かった。
SOCKS5 経由でリモートログインしたいサーバーは限られているので、/etc/hosts にリモートサーバー名とグローバル IP を書き、ssh の設定ファイル(~/.ssh/config) を以下のように設定して、リゾルブをローカル側で行うようにした。
Host remote_host1 remote_host2 ProxyCommand /usr/local/bin/connect -5 -R local -S socks-server %h %p