オイラーの贈り物が届いた。
amazonで他の中古が4000円という中、半額以下の商品にしては
綺麗なほうだった。
いっぱい書き込みしてあるほうが、躊躇なく本をぼろぼろに出来るからうれしいのに・・・
本読んでがんばろう。

OS自作入門、を読んでいて疑問に思ったこと。

harib08h、sheet_refreshmap関数から
sht = ctl->sheets[h];
sid = sht - ctl->sheets0; /* 番地を引き算してそれを下じき番号として利用 */

というポインタ同士の引き算についてなのだが、
自分は今まで「ポインタって言うのはメモリのアドレス(特殊な数値)」であり、
「メモリ番地は数値だから引き算できて当然と思っていた」訳です。

誤解の例
int型メモリ番地0x00000003-int型メモリ番地0x00000000を行った場合
答えは番地0x00000003になる

まぁ、プログラミング初めてまだ間もないから(←言い訳)
しかしこれは誤った理解であり、
_________________________________________________________________________________________________________________________

ある一次元座標上の座標位置A,Bを引き算して出てくる値は、
位置Aを原点とする座標から見れば、位置に違いないけど、
今使っている座標から見れば、位置の意味がなくなって、
位置Aと位置Bの距離になるでしょ。同じように
コンピュータが今使ってるアドレス空間上の番地A,Bを引き算して出てくる値は、
コンピュータが想定しているアドレス空間上の番地の意味はなくなって、
番地A,Bのデータ型のサイズでスケールされた番地A,B間の距離(符号つき整数型)になる。
すなわち位置と位置の差は距離。

_________________________________________________________________________________________________________________________

という至言をいただきました。つまりメモリアドレスって言うのは位置なわけです。量ではなくて。
今回の件でコンピューターの構造へのより深い理解が出来た。
というよりメモリアドレスとコンピューターの仕組みとポインタという仕組みの歯車が噛み合わさったような気がする。
Cってのは、要は関数内ローカルラベルや配列・構造体内の細かいアドレス計算の手間を著しく軽減してくれる
「高級アセンブラ」なんですよね。なので、それ以外の非局所的アドレス(ポインタ)の管理は、全て自己責任になる。

参考コード
_________________________________________________________________________________________________________________________

int a[3];
printf("%d\n", &a[3] - &a[0]);
これの結果は3になる。
すなわち
(((char*)&a[3])-((char*)&a[0])/sizeof(int)
ということ。

_________________________________________________________________________________________________________________________

今日はSさんにバイト変わってもらった。Binary 2.0カンファレンス2006見たかったので。
非常にためになった。
講師も含めて意外と若い人が多いように思った。
自分は独学だからこういうのを見ると、用語の発音の確認(Gnu=グニュー)にもなるし、とても励まされる。
自分が面白く感じたのは、
AMDで動く仮想マシンモニタ、getcontextの怪、lock-free synchronizationの話かな。
あとtty hacks for PS3 Linux は面白かったぁ。
プレゼンテーションってああいう風にやるんだね!