今日はメーデーです。そんなことより、エクスプローラのネットワークドライブへの無駄なリトライがすごくイライラする。
あるマシン A で Windows のネットワークドライブを設定(宛先を B とする)して、接続先であるマシン B を落とすと、当然そのネットワークドライブは使えなくなります。
そこまでは良いのですが、エクスプローラってば使えなくなったネットワークドライブにアクセスしようとすると 10秒近くフリーズしてしまいます。TCP SYN+ACK 待ちにしては諦めが早すぎるので、NetBIOS でしょうか?
さらに嫌なことに、ネットワークドライブと全く関係ない操作(例:フォーカスを戻す)でも、毎回ネットワークドライブを確認してはフリーズします。もうイライラして仕方ないです。
マシン A を起動した時点でマシン B が死んでいると、ネットワークドライブは切断されている扱いになって、上記の現象は起きません。その後マシン B を起動してもネットワークドライブは切断された扱いのままです。
切断されている状態だとネットワークドライブ上のファイルへのアクセスが軒並み失敗しますので、すぐにわかるかと思います。
しかしエクスプローラからネットワークドライブを見てしまうと再接続処理が走るようで、以降は接続された扱いになります。こうなるともうダメで、マシン B を落とすと上記のフリーズしまくり状態に突入します。
ネットワークドライブの接続先が Samba の場合はフリーズ現象が発生します。接続先のマシンを落とすと、ネットワークドライブのプロパティには「ネットワークドライブ:NTFS(または未フォーマットとも)」などと表示されます。
一方で Windows XP の共有ドライブの場合はフリーズ現象が起こりません。接続先のマシンを落とすと、ネットワークドライブのプロパティには「切断されたネットワークドライブ」と表示されます。
どうも Samba はサーバ終了時に、接続中のクライアントに何かを通知すべきなのに、全部すっ飛ばして終了するみたいです。オプションでなんとかならんかなあ…。
しかし、いつまでも未練がましく覚えているクライアント側も大概にしてほしいものです。なんとかしてネットワークドライブの記憶を消せないか探ってみました。
まず、以下のコマンドで ARP のキャッシュをクリアしました。
arp -d *
しかし症状は変わらず。
次に NetBIOS のホスト名 <-> IP アドレスのキャッシュをクリアしました。
nbtstat -R
やはり直りません。
エクスプローラが何か覚えているのかもと explorer.exe を強制終了させ再起動しましたが、依然として直りません。
残るは System プロセス(pid: 4)が覚えている可能性がありますが、確かめる方法がわからんなあ。
Linux のページディレクトリを見ていると 0xc000 0000 以降(※)はページディレクトリエントリがあるのに、その先のページテーブルがありません。なぜこれで動くんでしょう?
調べてみると、なるほど、トリックがありました。
Linux は CR4 の PSE ビット(Page Size Extension、ビット 4)を 1 にして、4MB/4KB どちらのサイズでも使えるようにしています。
確かめ方は、右 Alt + ScrLock を押してレジスタダンプすると簡単でしょうか?以下のようなメッセージが出るはずです。Pentium Pro から導入されているはずですので、未対応というのはそうそうないかと…。
Pid: 0, comm: swapper EIP: 0060:[<c01019bd>] CPU: 0 EIP is at default_idle+0x31/0x59 EFLAGS: 00010246 Not tainted (2.6.18-6-486 #1) EAX: 00000000 EBX: 00000800 ECX: c1101040 EDX: c030e000 ESI: 00099100 EDI: c0302800 EBP: 003a7007 DS: 007b ES: 007b CR0: 8005003b CR2: c02bd7f4 CR3: 07175000 CR4: 00000690 [<c0101a1c>] cpu_idle+0x37/0x4c [<c03105fa>] start_kernel+0x270/0x272
肝心なのは CR4 レジスタの値です。CR4 レジスタが 0x0000 0690、2進数だと 0110 1001 0000 ですから、ビット 4(ビット 0 から数えるので、右から 5番目)の PSE ビットが 1 になっていることが分かります。
(※)カーネルが使うリニアアドレス用のマッピングで、物理メモリ先頭 896MB 分を仮想アドレス 0xc000 0000 へマップしています。
物理: 0x0000 0000 .... 0x37ff ffff
リニア: 0xc000 0000 .... 0xf7ff ffff
というマッピングです。
じゃあ 4MB と 4KB の区別はどこでやってるのさ?というと、ページディレクトリテーブルの要素である、ページディレクトリエントリでやっています。インテルのマニュアルによれば、ページディレクトリエントリの構成は以下のようになっています。
細かい説明は後述しますが、PS ビット(Page Size、ビット 7)が 1 になっていれば 4MB のページを指し、0 ならば 4KB のページを使うことを意味します。
128MB の実メモリを割り当てた仮想マシン上で Linux を起動して、適当なプロセスのページテーブルをダンプしてみると、768 要素目から以下のようなページディレクトリエントリが見受けられます。
128MB しか実メモリがないので、768〜799 番目(4MB x 32ページ)までしか値が埋まりません。余った 800 番目以降は別の用途に使われます。
768: 0x000001e3, 0x004001e3, 0x008001e3, 0x00c001e3, 772: 0x010001e3, 0x014001e3, 0x018001e3, 0x01c001e3, 776: 0x020001e3, 0x024001e3, 0x028001e3, 0x02c001e3, 780: 0x030001e3, 0x034001e3, 0x038001e3, 0x03c001e3, 784: 0x040001e3, 0x044001e3, 0x048001e3, 0x04c001e3, 788: 0x050001e3, 0x054001e3, 0x058001e3, 0x05c001e3, 792: 0x060001e3, 0x064001e3, 0x068001e3, 0x06c001e3, 796: 0x070001e3, 0x074001e3, 0x078001e3, 0x07c001e3, 800: 0x00000000, 0x00000000, 0x07baf067, 0x00000000,
772 番目を例に取ると、0xc100 0000〜0xc13f ffff の 4MB 分のアドレスをマップしています。0x010001e3 は 2進数だと 0001 0000 0000 0000 0001 1110 0011 ですので、先ほどの図に当てはめてみると、
4MB のページングを使っているのはカーネル用のリニアアドレス(0xc000 0000〜)だけのようです。他のページディレクトリエントリには PS ビットが設定されていません。ページ番号の指す先には、もう一段ページテーブルがあり、その先にやっと 4KB のページがあります。
理由ですが、インテルのマニュアルによると 4MB と 4KB のページは別の TLB に置かれるので、カーネルのように頻繁に使うコードやデータは 4MB ページに置いておくと、フラッシュされなくて良いよ、ってなことが書いてあります。また、ページサイズが大きければ TLB ミスも少ないよ、ってな解説もあります。恐らくそんな理由です。
絵にしてみるとこんな感じでしょうか。間違ってるかも…。
サイズはアドレスの範囲を意味するのではなくてテーブル自体の大きさのことです。ページディレクトリテーブル(一段目のテーブル)も、ページテーブル(二段目のテーブル)も 4バイト x 1024 要素なので同じ 4KB ですよ、って言いたかっただけです。
毎回話題がバラバラな日記ですみません。今日は補数の話です。
N 進数の補数は 2つあります。N の補数と、N-1 の補数です。10進数ならば 10 の補数と 10-1 の補数(9の補数ともいう)があります。
ある N 進数 x の N の補数 y とは、足すと桁上がりする最小の数値を指します。
10進数でいきますと、x = 123 だとしたら、10 の補数は足すと桁上がり(1,000 になる)する最小の数値ですから 877 です。
要するに y = 1,000 - x = 1,000 - 123 = 877 と計算します。4桁の数字なら 10,000 から引けばいいですし、5桁なら 100,000 から、n 桁なら 10^(n) から引いてください。
ある N 進数 x の N-1 の補数 z とは、足しても桁上がりしない最大の数値を指します。
また 10進数を例に取ると、x = 123 として、10-1 の補数は足しても桁上がり(1,000)に達しない最大の数ですから、876 です。足すと 999 になります。
これも要するに z = (1,000 - 1) - x = 999 - x = 876 と計算します。特徴として、10 の補数から 1 引いても得られますし、逆に 10-1 の補数に 1 を加えると 10 の補数になります(この性質は後ほど重要です)。
N の補数は何が嬉しいかというと「負の数の表現として使えば、引き算が不要になる」という点です。
3桁の 10進数 500 - 300 を計算したいとします。「引き算は知らないが 3桁の足し算と 10 の補数を書いた表だけ持ってる」と仮定します。むちゃくちゃに見えますけど、後で意味が分かると思います。
引き算は知りませんので、まずは負の数を消しにかかります。負の数は絶対値の補数に置き換えて消します。表を見ると 300 の 10 の補数は 700(計算で出すなら 1,000 - 300)ですから、
500 - 300 = 500 + 700
こう置き換えます。すると足し算のみになって、計算できるようになります。
500 + 700 = 1,200
4桁目が出てきてしまいましたが、3桁の足し算しか知らんので 4桁目は捨てます。さようなら〜。
1,200 => 200
この結果は 500 - 300 = 200 の結果と一致します。
不思議に見えますが、そもそも補数 y の定義が y = 1,000 - x なので、x = 300 で式を展開すると、
500 + (1,000 - 300) = 1,200 --(4桁目無視)--> 200
となるのは当たり前といわれれば当たり前の結果です。しつこいですが大事なポイントは「引き算が足し算に化ける」という点です。
とはいえ、10進数だと補数を計算するために結局引き算が必要で、ありがたみがありません。これはその他の記数法(図では 3進数を例とした)でも同じです。
ところが 2進数となると非常に嬉しい性質があります。以下の図を見てください。
2進数においては全桁を反転させる演算(Not 演算)によって、容易に 2-1 の補数を得ることができ、そこに 1 加えれば 2 の補数を得ることができます。つまり Not 演算さえあれば 2 の補数の導出に引き算は不要です。コンピュータだからこそできる技といえましょう。
この性質のためコンピュータに減算器は不要で(※)、加算器の前に Not 演算と 1 加える回路をつけるだけで良いのです。回路が少なくなればコンピュータも安くなります。いやあ、補数って素晴らしいですね。
(※)コンピュータは前章の説明に出てきた「引き算は知らないが 3桁の足し算と 10 の補数を書いた表だけ持ってる」の代表格です。コンピュータの場合 2進数を扱うため 10の補数ではなく 2の補数です。
まとめると「一定桁(32桁、64桁など)の足し算と、2の補数しか知らない」変な奴と言えます。本当は意図的にそう作っていると言った方が正しいですけど…。
補数を負の数として扱うと良いこと(減算がなくなる)があるのは分かっていただけたかとおもいます。残る問題はどこからを負の数と見なすかです。卑近な例で言うと printf したときに、どこからマイナスなのよ?って話です。
前章まで話してきた計算の問題と関係ありそうに見えますが、実は全然関係ありません。ぶっちゃけた話、どこから負の数と見なしても構いません。以下の図をご覧下さい。
この図にある解釈方法ですと 2進数の 101 以上を負の数と見なします。
何?ずれてる?いやいや…。このような解釈でも使っている人がウンと言えばそれで良いんです。とはいったものの、この方式ではウンと言う人は少なそうです。この方式は欠点が多すぎます。
桁が増えたときに正負の境界をどう決めるかがあいまいであるがために、境界を見分ける処理が複雑になる可能性があります。プログラマや回路設計者に嫌われますね。それとやたら正の数ばかりが多くて、負の数を使いたい人にも嫌われます。
多くの方が見慣れたパターンは、最上位のビットが 1 なら負の数と見なす、以下のような解釈方法でしょう。
この解釈方法が採用されている理由は、効率的だからだと思われます。この解釈方法であれば、何桁になろうとも「最上位ビットの有無」という同じルールが適用できます。さらに正の数の範囲と負の数の範囲がほぼ同じ(負の数の範囲が 1 広いけど)で使いやすいのです。
ファミコンのアルテリオスというゲームを攻略した情報を一生懸命メモした(特にパスワード)のに、またやろうとしたら紙がない。こういう時って、やる気がなくなって諦めた頃に紙が出てくるもんですよね。
ここに書いてしまえば忘れないだろってことで書いておきます。まあ、ネット上の情報も「どう頑張っても探せなくなった」ら、消えたも同然なんですけどね。人の記憶と似てますねえ。
アルテリオスはうまくできていて、主人公の名前によって扉のパスワードが変わります。なので主人公の名前を「A」にしないと、以下のパスワードと違うパスワードになってしまうはずです(私には確認できませんが、カセットのロットなどその他の要因でも変わるかも)。
まあ、攻略の有無以前に単純に敵が強くてクリアできてないけどな…。ハイパーなんちゃら系がアホみたいに TUEEEEEE ので、必ずボコボコにされる。
チートコードを調べてたときのメモです。知ってどうする情報とか、いじるとおかしくなる情報もあります。自己責任で。セーブデータが飛んでも知りません。
0026: 戦闘時の横位置、移動時の横位置も?
0702: 戦闘時の縦位置
0428: HP
0430: WE
6201: 敵の縦位置 0x65 くらいで自分の初期位置
6202: 敵の横位置 0x80 くらいで自分の初期位置
6230: 敵弾の判定? 0にすると敵の弾が来ない
070e: 左の自弾の横位置
0716: 右の自弾の横位置
マップは変化しないが、出現する敵などに影響する。
0420: 現在居る惑星
00 メイランド
01 ユナイト
02 リートランド
03 ディーモス
04 トゥメールカムス
05 ディーモス
06 トゥメールカムス
07 (バグってリセットされる)
自身が居る位置は左上から右向きに 1ずつ増えるようだ。
(画面左端)0 1 2 3(画面右端)
4 5 6 7
続く...
例えばメイランドだと、0x40 足すと一個下に進める
0421: 自身が居る位置、上位 8ビット
0422: 自身が居る位置、下位 8ビット
マップを変えられるが、大抵変なところにはまる。
0423: 現在居るマップ
00 メイランド、メイン迷路
01 ユナイト、メイン迷路
02 ユナイト、ダーフラの街
03 ユナイト、ニーツニーの街
04 ユナイト、イクニバッドの街
05 ユナイト、オドラノエルの街
06 リートランド、メイン迷路
07 リートランド、小惑星
08 リートランド、コロニー
09 ディーモス、メイン迷路
0a ディーモス、城内
0b ディーモス、ノエロパの街
0c ディーモス、エトラパノフの街
0d トゥメールカムス、メイン迷路
0e トゥメールカムス、宮殿
0f トゥメールカムス、宮殿最深部
10 トゥメールカムス、レルチの街
11 トゥメールカムス、フローダの街
12 以降はバグる
(下位 4ビットが種類、5ビット目が装備しているか否か、それ以外は無意味)
042c: 武器1
042d: 武器2
042e: 武器3
042f: 武器4
043e: ストップ個数
043f: デビルハンマー個数
0440: デストロイド個数
0446: アイテム装備状態(2: ストップ, 4: デビルハンマー, 8: デストロイド)
0447: 武器攻撃力合計値
実家にはまだアルテリオスのカセットがあるはずですが、肝心のファミコン本体が死んじゃったからなあ。もうエミュレータでしか画面が拝めないのかあ…。
大下さんちに遊びに行きました。阪急の淡路駅で初めて降りた気がします。
淡路駅は特急が止まります。ですが駅前には商店街があるだけで特に何があるっつーわけでもないです。駅や周辺地域の規模ではなくて、交通要所(千里線と京都線の乗り換え駅)だから止まるんだな。たぶん。
目次: プロバイダ - まとめリンク
大下邸の PC のセットアップをしました。NTT 西日本の B フレッツ(光プレミアム)では ONU(光ファイバーつなぐやつ)以外に、CTU というルータのような装置を貸与されます。CTU は DHCP サーバとして動くので、大抵はケーブルを差せば動くようになっております。
無線 LAN も使いたかったので、無線 LAN ルータの DHCP サーバ機能を殺して接続しておきました。PPPoE も DHCP も NAT も何もかも OFF にしているため、無線 LAN ルータではなく単なる有線 <-> 無線ブリッジになり下がってますけど。もったいない話だ。
CTU は NTT 西日本独自の装置らしくて、地域 IP 網(IPv6)とユーザ側のネットワーク(多くは IPv4)を橋渡しする役目を果たしているようです。それ以外もごちゃごちゃやってるようですが、あまり詳しく書いてあるところがないですね…。
大きさも普通のルータ程度ですし、ルータ機能も良くできてると思いますが、設定するために一々 NTT のサーバへアクセス(アドレスは https://ctu.fletsnet.com/, IPv4:210.247.16.1, IPv6:2001:d70:3:1::3:3)しなければならないのがめんどくさい…。
うーむ、風邪引いたかもしれん。
いつからか我が家の VAIO type G のファンがぶんぶん回りっぱなしになっています。冬の間は「うるせえなあ…」と思う程度で済んだのですが、改めて本体を触るとかなり熱い。
これから夏を迎えるに当たって温度が心配になってきましたので、原因を探ってみました。
さて負荷をどうやって調べるかが問題です。ファンがブンブンしている状態でタスクマネージャを見ても 0% のままで、負荷がかかっているのかすらわかりません。というわけで 1秒おきに rdtsc 命令を発行し、その差分を表示するプログラムを書き(※)ました。
このプログラムが表示する値を理解するには、まず CPU の動作周波数がどうやって決まるか、rdtsc 命令の返す値は何を表すか、を説明しなければなりません。付け焼き刃の知識で頑張って説明します。
(※)本来なら自分で書かなくても、Crystal CPUID の Real Time Clock 表示機能を使うべきです。しかし Crystal CPUID は無駄に表示が凝っており、表示の負荷でシステムクロック周波数が上がる(rdtsc の変化分が 300MHz くらいまで)本末転倒状態だったので、没にしました。
まず CPU バスクロック(CPU <-> ノースブリッジバス)の説明から入ります。CPU バスクロックはシステムバスクロックの半整数倍です。VAIO 君の場合はシステムクロック = 133MHz、CPU バスクロック = システムクロック(133MHz)x 4倍 = 533MHz のようです。
システムクロックはマザーボード上の水晶振動子(安い 10MHz〜30MHz くらい?)を原発振とした PLL(Phase Locked Loop)で供給されます。PLL って何?と聞かれても詳しくは知らんので勘弁して下さい。
CPU バスは Intel の伝統で FSB(Front Side Bus)と呼ばれ(※)ますが、今回は CPU バスで通します。
ノースブリッジにはメモリコントローラが載っていて SDRAM が繋がっています。比較的高速のバス(AGP バス、PCI-e x16 バス)などをノースブリッジに繋げることが多いようです。
ノースブリッジの先にはサウスブリッジが居て、PCI バス、PCI-e x1, x4 バスなど、比較的低速のデバイスを繋ぐことが多いようです。
CPU <- (1) -> ノースブリッジ <- (2) -> サウスブリッジ
| | (PCI バス)
DDR SDRAM PCI デバイス
(1) FSB(Front Side Bus, Intel 系), HyperTransport(AMD 系)
(2) DMI(Direct Media Interface, Intel 系), HyperTransport(AMD 系)
別にこの 2つでなければならないことはないです。
他の方式で接続するシステムも有るはず。
重要な点として、(1)、(2) のクロックと DDR SDRAM や PCI のクロックは全て同期しています。でないとデータのやりとりができないからだと思うんですが…。
そのため CPU バスと同様に、システムクロックから生成したバスクロックを用います。PCI バスだと 33MHz を欲しがるので、システムクロック 133MHz x 1/4 = 33MHz とします。
(※)"Front" Side Bus に対して "Back" Side Bus もあるのか?
BSB もあります、いや…ありました。BSB は CPU <-> 2次キャッシュのバスです。しかし最近は CPU に 2次キャッシュも混載されているので BSB は不要です。ですから「最近のシステムにはありません」という方が正しそう。
rdtsc 命令とは CPU 内部のタイムスタンプカウンタを読み出す命令です。Core 系以前の CPU では rdtsc のカウントアップ周波数 = CPU 動作周波数でしたので、SpeedStep などで倍率を変化させると rdtsc の増分も変化していました。しかし Core 系では常に一定の周波数(Core Solo 1500U の場合は最大動作周波数 1330MHz)でカウントアップされます。
(hdk 氏、ご指摘&情報提供ありがとうございます)
つまり、
過去の CPU: システムクロック x 動作倍率(可変)
Core 系: システムクロック x 一定値
です。
じゃあ最初に書いた rdtsc を見るプログラムって意味無くね?と思うのはまだ早いんだ、これが。
VAIO 上で先ほどのプログラムを使って rdtsc の増分を見ると、システムの負荷によって変化します。rdtsc の増分はシステムクロック x 一定値、のはずですから、変化しているのはシステムクロック側と予想されます。
システムクロックを上げれば茨の道のオーバークロック(※)ですが、下げる方向に使えば省エネです。VAIO では CPU の省エネ機能(Enhanced SpeedStep)に飽きたらず、システムクロックも下げさらに省エネしようという設計なのでしょう。
(※)規定値よりシステムクロックを上げることをオーバークロックといいます。今までの説明からも類推できるように、システムクロックをメチャクチャ上げると CPU バスクロック、さらには PCI バス(1/4 倍 = 33MHz)や AGP バス(1/2倍 = 66MHz)まで上がり、いずれバスに繋がっているデバイスの許容値を超えて異常動作したり動作しなくなります。
この問題の解決にはシステムクロックと周辺バスクロックの比率を変える必要があります。オーバークロックを売りにしているマザーボードだと比較的柔軟みたいです。
システムに負荷をかけると、システムクロックが最大値に張り付いて rdtsc の増分も最大値である 1330MHz に張り付きます。負荷が低いと 50MHz 程度(※)まで落ちます。
さて、今の VAIO を見ると 1330MHz に張り付きっぱなしです。ファンがずっとブンブンしているのはこのせいでしょう。
ファンのスピードはシステム負荷に連動しているようなので、rdtsc 値の増分を下げる方向 = システムクロックを下げる方向へ改善することで「ファンがブンブン言う問題」は解決すると思われます。VAIO がシステム負荷をどうやって測定しているのかまではわかりませんでした。
(※)負荷が低いときは CPU 内部動作周波数倍率は 6.0倍まで落ちますので、rdtsc カウンタの増分 x 6/10 が本来のシステムクロックです。まあ、その辺の細かい値は今回どうでもいいので、高い、中間、低い、くらいが見えれば OK です。
というわけで犯人捜しです。片っ端からケーブルを引っこ抜いてみると、USB HDD を引っこ抜いた段階で 50MHz くらいまで下がりました。犯人はこれかあ。手始めに、デバイスの取り外しで無効化してみたものの全く負荷が下がりません。
USB 2.0 コントローラが有効な状態で一度 USB HDD を認識させてから、USB 2.0 コントローラ(Intel USB2 EHCI)を無効にすることで、USB 1.1 の機器として再認識させると、負荷が下がりました。
これで解決ですね……って、こんなん毎回やってられんよ。面倒くさくて死にそう。
ひょっとすると HDD ケース(センチュリーのやつだった気がする)がおかしいのかもしれません。こやつは Windows XP の起動時に電源 ON だと 100% BoD するという、怪しさ爆発デバイスです。
というわけで別の USB HDD を繋いで、再度実験。やはり負荷が上がってダメです。さらに手持ちのデバイスで実験。
うーむ、どうも USB Mass Strage が NG っぽいですね。Windows の USB EHCI ドライバか、USB Mass Strage ドライバのどちらかが常に負荷をかける作りになっているんでしょうか?これはノート PC の設計者に優しくない作りだなあ…。
まとめといた。
Windows XP 用のメイリオフォントが公開されたので入れてみたら、IT Media のビジネスニュースサイト Business Media 誠の表示がメイリオで出るようになってしまった。見づらい。
調べたら、スタイルシートでフォントが指定("メイリオ","Hiragino Kaku Gothic Pro","ヒラギノ角ゴ Pro W3","MS Pゴシック",Osaka の順だった)されていたためでした。今までは優先度 4 の MS Pゴシックが選ばれていたのに、メイリオを入れたことによって優先度 1 のメイリオが選ばれるようになったわけです。
Web ページでフォント指定するなよ、全くもってダサイな…。SeaMonkey の設定で、Allow documents use other fonts を OFF に、ついでに Minimum Font Size も 10 くらいに上げておきました。ん、見やすい見やすい。
5/7 に Windows XP SP3 がリリースされました。デスクトップに早々とインストールしたものの、ノートのことをすっかり忘れていました。
これまた寝る前に始めたのが良くなかった。朝までノートを動かす羽目になりました。寝るときノートの液晶画面が眩しい、かといて閉じるとスリープする…とお悩みの方。スリープしないよう設定変更するのも手ですけど、単に輝度を最低に落とすだけでも割と良い感じですよ。
会社でも SeaMonkey を使っています。通常のブラウジングには苦労しませんが、会社の変なシステムが IE6 専用でして、全く動きません。しかもやたら別ウインドウを開きたがる悪い癖のあるシステムなのでウインドウだらけになる。IE 系のタブブラウザでも動くかなあ、動くようなら導入しようかな。
5/6 から引きずってた風邪がここにきて悪化してきた。頭がガンガンする。飲み会に行きたかったけど、諦めて寝よう。
おとなしく寝てました。熱もあるんだろうけど、鼻〜喉がヤバい。焼け付くような感じがする。
熱は下がったけど、喉がヤバいことに変わりなし。起きている間に良化 -> 寝ている間に悪化を繰り返しているみたい。部屋の空気が乾燥しているとかかなあ?
昨日はご飯食べるの忘れてたので、今日はきちんと食べました。
有給をとって休みました。お休みを病欠で消費するとすごくもったいない気がするのです…。
上の一文をどこかで見た気がすると思ったら、去年の 6月11日(2007年 6月 11日の日記参照)にも風邪で有給を取って休んでいて、同じようなこと書いていました。ああ、進化してない。
昔からこの時期(4月末〜 5月末)はほぼ確実に風邪を引いている。時期に何か秘密があるのかなあ?季節の変わり目にしては遅いような気がするんだけど。
以前から Linux のページディスクリプタ(要は struct page)って何なの?という疑問が晴れないまま居ました。特に実際のページフレームとの対応をどうやって取っているのかが全くわからん。どこかに対応が書いてあるにしては、それらしい場所がない…。
分からんながらも、機会を見つけては調べたり考えたりしていたら、なんとなーく分かった気がする。
分かった気がすることを書き散らしますが、間違っててもご勘弁下さい。自信ないです。
前提知識として簡単に説明します。Linux ではメモリ領域をゾーンという固まりで管理しています。ゾーンはページフレーム(普通は 4KB のメモリ領域)をいくつかまとめた固まりです。ページフレームがずらーっと並んでいるようなイメージ。
厳密にはもっと書くべきことがあるのでしょうが、今回はこのくらいの理解で進めるはず。たぶん。
では本題に入ります。
まず私の疑問点は「ページディスクリプタ(以下、struct page)のポインタをもらったとき、どうやって対応するページフレームを得るのか?」です。
ここで struct page のメンバに直接書いてあれば話は早いのですが、struct page にページフレーム番号を示す情報などはありません。残念。
実は struct page は中身も大事ですが、ポインタ値が非常に重要な意味を持ちます。というのも実メモリのページフレームとの対応を取るために、ポインタの計算を行うからです。計算についてはまた説明します。
ページフレームを求めるためには、
ページディスクリプタ -> ゾーン -> ページフレーム
の順に求めます。まどろこしいですが、直接求められないのです。
ページディスクリプタが対応するページフレーム、こいつが属するゾーンを求めます。自分でも何言ってるのかわかんないけど、まあいいや。
まず struct page に page_flags_t flags というメンバを見ます。こいつはその名の通りページの属性や状態を示すフラグを格納する変数なのですが、上位 3ビット(または 8ビット)だけは意味が違っていて(※1)、このページが所属するゾーンを表す数値が入っています。
なので flags >> NODEZONE_SHIFT によってページが何番目のゾーンに所属しているのかがわかります。例えば 1 だとしたら、ゾーンの配列 zone_table[1](グローバル変数)を見ればゾーンの情報が見られます(※2)。
(※1)不思議な設計に見えますが、むやみにメンバを増やすと struct page だけで相当量のメモリを圧迫(struct page はページフレームの数だけ存在する)してしまいます。
(※2)最近の Linux ではゾーンの一覧(zone_table)はグローバル配列ではありません。struct pglist_data という構造体(ゾーンが必要なら node_data というグローバル配列(アーキテクチャ依存)、ゾーンが不要なら contig_page_data という変数)経由でゾーンを見るようになっています。ゾーンが要らないというアーキテクチャを考慮したのでしょう。
長くなってきましたが、本題のページフレームの求め方に行きます。先ほど苦労して求めたゾーンには zone_mem_map というメンバが居て、ゾーンに属する struct page の一覧を持っています(※3)。
上の絵で注目して欲しいのは zone_mem_map と、ページディスクリプタのポインタ(p とします)がわかれば、zone_mem_map の何番目に p が存在しているかわかるということです。上の絵では 5番目に位置しています。
薄い水色の四角内で具体的な数値(数値は適当ですが)を当てはめて p のアドレスから zone_mem_map のアドレスを引くことで、p が zone_mem_map の何番目にいるか求められる様子を示しています。
これで struct page がゾーンの先頭から何番目のページなのかがわかりました。あとはページフレームを求めるだけです。ゾーンの構造体のメンバ zone_start_pfn がゾーンの開始ページフレーム番号を表しているので、そこへ先ほどの数字(5)を足します。
これにて struct page と対応するページフレームが求められました。
もし物理アドレスに興味があるのならば、ページフレームの番号にページフレームのサイズ(普通は 4KB のはず)を掛けてあげればよいです。
高位メモリや非連続なメモリモデルを持つアーキテクチャだと、単純に掛けるだけではダメかもしれません。
(※3)最近の Linux にはありません。恐らく zone_pgdat->node_mem_map が等価だと思われます。たぶん…。
所属していた研究室の Skepe チャットで、変なキーボードの話をしていました。聞けばほぼ正方形のスペースキーを搭載した変なキーボードがあると言うではないですか。写真も見せてもらいましたが、本当に正方形です。変なの!
…やややや、まてよ?このキーボードどこかで見たことないか?と思い、会社のメインキーボード(DELL SK-8135 日本語配列)を見たら、スペースキーが正方形じゃないですか…。そりゃ見たことあるわけだよ、既に使ってたんだもん。
見た目はかなり変テコですが、使い心地は普通です。スペースキーが小さい分、微妙にデカい無変換キー(普通は Alt より細い)を誤打するくらいで、すぐに慣れてしまいます。
このキーボードのおかげなのか、家のキーボードでスペースキーを叩くときもキー一つ分(幅としては SK-8135 の無変換キー分くらい)を無意識に避けて押しています。
今回の日記を書いているときに初めて気づいたので、いつからこうなってたのかはわかりませんけども。
ぜひ皆様にどんなキーボードか見ていただきたくて、型番で Google 検索したらこんな写真をブログに貼っている人がいました。
うは、まさにこれだ。スペースキーが正方形なのさ。
今週一週間で、月の残業時間の半分を使ってしまった。またか、またなのか!
付け方を控えめにしてるつもりなのにねえ…。
グリーンピースがまた犯罪行為してます。目立とうとしすぎて犯罪団体になっています。さすがに拉致、放火、殺人はやらないと信じたいですけど…。とにかく捕鯨船乗組員の安全を祈るばかりです。
そういえばグリーンピース・ジャパンのページを見ると、
Q. 鹿やカンガルーのように鯨も間引くという考えはないのか。
A. 鹿やカンガルーは「捕食される側」の動物だから、間引かれるべき。鯨は「捕食する側」だから間引くのはおかしい。
という問答があります。つまり鹿やカンガルーは多すぎだから逝って良しってことで FA らしい。これが環境保護か。
窃盗までして捕鯨を責める暇と金と時間があるなら、
環境を蘇らせる技術の研究所を世界各地の大学に作って、全面バックアップしました!!
とか、
ど田舎の土地を日本の国土面積の数倍規模でがっつり買い取って、全部環境保護区にしました!!
こんなことをやって欲しいです。一面にこんな見出しが躍ってたら痺れます。
グリーンピースには世界各地の企業、財団からの大量の寄付(うちは環境に配慮してますよ、という姿勢のため)で潤ってるはずなので、資金はあると思います。が、残念ながら、どんなに資金があってもやらないでしょう。グリーンピースがスポンサーを取り続けるには、とにかく目立つしかありませんから、結局は環境なんか二の次で「目立つ(つまり儲かる)こと」を選ぶのです。
また、スポンサー企業を敵に回すような活動はできません。グリーンピース以外にも環境団体はいくらでもありますから、そちらに流れられたら一巻の終わりです。
例えば石油を消費すると CO2 が増えて環境に悪いです。しかし石油製品の不買運動なんて運動はさっぱり見かけません。だってそんなことしたら金づ…じゃなかった、石油関連企業からそっぽ向かれますから。
その点、捕鯨反対なら心配ありません。鯨を食べる国は圧倒的に少なく反感を買いませんし、大きな生き物を殺す抵抗感にも訴えられます。さらに日本船が相手なら超ラッキー!機関砲かロケットランチャーぶちこまれるまで反撃しない国ですからね。
カモがネギ背負って鍋担いでガスコンロとボンベにマッチまで持ってるんですから、おいしくいただかない理由はありません。というわけで捕鯨反対はやめられない止まらないのです。
唐突に気づいたのですが、クラーク像は「札幌じゃなくて北広島にある。」って、色んな人に吹聴した気がする。壮絶な嘘です。クラーク像はどちらも(※1)ちゃんと札幌市にあります。嘘を教えてしまった方々には深くお詫び致します。
無知も良いところでした。今度実家に帰ったとき、ちゃんと見てきた方が良いですかねえ…。
(※1)胸像と全身像があります。胸像は北海道大学(札幌キャンパス、札幌市北区北 8条〜24条)に、全身像は羊ヶ丘展望台(北海道札幌市豊平区羊ヶ丘 1番地)に建っています。
北広島市と勘違いしていた理由も調べました。クラーク博士がアメリカに帰るとき「Boys be ambitious …」と言って去った有名なエピソード、この舞台が現在の北広島市にあるのです。像と Boys be ambitious の話とがごっちゃになったようです。
ついでに例のフレーズは「Boys, be ambitious like this old man.」(小供等よ、此老人の如く大望にあれ。)と続く(※2)ことも知りました。
クラーク博士ってばまるで映画の主人公のようですが、歴史が美化されるのはお約束ですから怒っても仕方ないのさ。
(※2)英文および訳文は北海道大学付属図書館 W.S.クラーク博士関係文献目録の一部である、こちらのページから引用しました。
知り合いに小泉という名字の人が居ます。最近は毎日と言って良いほど、彼の名を思い出します。
といっても意味深なことはなくて、通勤中に電車の窓から「こいずみがわ」と平仮名で書いた看板が見えるというだけです。位置は島本〜長岡京の間、JR 京都線の北側(京都方面を向いて左手)にあります。川の脇にある緑色の看板です。
JR 京都線はさほど混まないので、気づけば毎日同じような位置に立ち、毎日同じような景色を見るようになっていた、ってなわけです。明日もまた同じように「こいずみがわ」を見るでしょう。
小泉川の写真でも撮って、その小泉君に見せたら面白いかなあ?と思ってたら、なんと既にこのページで上流〜中流〜下流(桂川と合流)まで、写真付きで詳しく紹介されていました。
うむむ…。世の中は広いんだぜ…。
社会人 2年生になって、基本給がレベルアップしました。しかし前年度より手取りが下がります(来月から住民税を取られる)。
今年の住民税の所得割額は「昨年の総所得」から決まります。つまり今年の所得に対してかかる住民税は、来年納めるわけです。実に 1年も時間差をつけて攻撃(納税)されます。
サラリーマンはあまり問題ないかもしれませんが、仕事を変えるなど所得が大きく変化するとき、臨時で大きな収入があった年などは、住民税のことを覚えておかないと、翌年の時間差攻撃でひどい目にあうかも…。
阪急のドア横には「非常時に引くとドアが開きます」と注意書きされた箱があります。緊急時、すぐさま車両の外に避難しなければならない時に使います。
で、少し気になったのは「地下鉄内では使わないでください」という注意書きです。注意書きには残念ながら詳細な理由は書いていません。地下鉄のトンネルに出ると何か問題が起きるのだろうか?
私が思い当たる理由は給電方式の差です。地下鉄は地上の電車のように上から給電するタイプ(架線給電方式)と、レール近くの電線から給電するタイプ(第三軌条給電方式)があります。第三軌条給電の場合、トンネルへ下手に降りて電線(600V〜 くらい)に触れようものなら感電死します。
阪急は架線給電だから阪急が乗り入れる地下鉄も架線給電でないと走れません。架線給電なら、トンネル内に出ても危険はないはずです。しかし大阪市営地下鉄は第三軌条給電が多いらしく、阪急の時と同じノリで地下鉄から降りられると危ないので、全面禁止にしたのでしょう。
お陰で乗客は降りて良いトンネルにも降りられません。阪急もその辺は理解していると思いますが、乗客への説明&周知徹底する面倒くささには勝てないのでしょう。
同期の皆さんとともに天橋立(京都府宮津市)に行ってきました。丹後の天橋立(京都府)、安芸の宮島(広島県)、陸奥の松島(宮城県)が日本三景と言われています。
天橋立は海流によって砂が運ばれ堆積した地形です。くちばしのような形状が多いことから、砂嘴(さし、砂のくちばし)と呼ぶそうですが、天橋立のように成長して対岸にくっついた場合は砂州(さす)と呼ぶそうです。
地理の話はそのくらいにして、まずは南側から対岸へ向けて、松林を北上しました。晴れていればとても素敵な散歩道だったでしょう。今日は雨のせいで何も見えません。
松林は軽く 4km ほど続きます。景色がずっと同じで写真の撮りがいがありません。困ったもんです。
観光協会も気づいているのか、松林の退屈さをなんとかしようと道ばたにアームストロング砲を置いたり、変わった形の松に名前を付け(夫婦松など)たり、地元の伝承を事細かに語る看板を立てたりと、頑張ってます。
が、その努力も虚しく 2km ほど行った地点でマンネリ感に満ちてきます。あとは 小 1時間ずっと同じ景色、雨も相まって正直きついです。
傘を差していたのに傘から雨がしみ出していて肩から腕までびしょぬれ。さらにイラつくことに傘は新品、しかも 300円よ?土産屋で買ったのが良くなかったな。素直に友達の折りたたみ傘を借りれば良かったと何度も後悔した。
途中にあった神社が妙に金持ちです。建物はピカピカですし、手水舎にセンサーがついていて近づくと自動で出る、などという成金な仕掛けがありました。仕掛けが面白かったので動画で撮りましたが、私のキモい話声が際限なく入ってたので公開はやめときます。
山の上からなら見えるだろうと一縷の希望にすがり、ロープウェーに乗り、展望台へ。…うむ、空も海も橋もへったくれもない。なにも見えん。
近くに居たおばちゃん達と「一瞬でも良いから晴れないかねえ…。」なんて話しつつ、霧が晴れるのを待ちましたが晴れる気配なし。悲しいけど風邪を引く前に撤退。
一番マシな写真がこれです。肉眼でもこんなもんでした。残念。チャンスがあればもう一回行くべきだな。
大下さんと北野天満宮(京都府京都市上京区)の骨董市に行きました。骨董市といっても特別なことは何もなくて、出店とフリーマーケットが混ざったお祭りみたいなもんです。
北野天満宮に来たのは初めてだったので、ついでに写真を撮りながら歩きました。
境内にも人が一杯。建物の中でご祈祷をやっていました。祈祷料は数千円と書いてありました。「面白そうだからやろう」と大下さんを誘ったのですが、高いから嫌って言われた…あっそ…。一人でやってもなんか虚しそうだよなあ。
店を一通り見たら疲れてしまった。社会人になろうとも体力のなさは変わらないのである。
おやつでも食べようかってことで中村軒(京都府京都市西京区)に行きました。桂離宮の近くにあります。かき氷が有名なお店なのだとか。
中村軒のかき氷(奥)、おうす(抹茶のこと、左)、白きんつば(手前)
大下さんが何度もここのかき氷はおいしいんです!と言ってましたが、正直かき氷なんてどれも大差ないと思ってました。しかし食べてみると違うもんですね。
いわゆるかき氷シロップではなくて、生の苺をすりつぶして作ったソースがかかっているのです。うまうま。
同期の Sena さんと寿司を食いに行きました。というか今更書かなくても毎週行ってますけど…。Sena さんは、寿司ばっか食ってる私に、飽きずによく付き合ってくれてありがたいです。
富田駅の近くにある権太呂寿司です。回らない寿司屋だけど 2貫で 126円(税込)と、値段は回転寿司並のリーズナブルさが良いのです。
最近はビントロばかり食ってます。あっさりなのかこってりなのか良くわからないこの感じが、何とも言えないぜ。
先日、同室の隣人から DVD 返しておいてくださいな、と頼まれました。延滞してるから後で払います、よろしく〜と、彼は再び岡山へ旅立って行きました。いつも大変そうだなあ…。
で、その DVD は本来昨日返すべきだったのですが、中の映画(ボーン・アルティメイタム)が気になって見てたら閉店時間を過ぎてしまった。余計に延滞してしまったぞ。
今日返したら 4日延滞と言われ 1,200円も取られた。延滞料金って高いのな…。
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2021.
Powered by PHP 5.2.17.
using GD bundled (2.0.34 compatible)(png support.)