とりあえず現状ぶつかっている妙な挙動と実装上のメモ
【実装上のメモ】
- SBCLではヒープに割り付けられたメモリは*ほぼ*Lispオブジェクトとして扱える
- 一部違うものもあるっぽいが、少なくとも2ワードはあると断定できるらしい
- Lispオブジェクトならヘッダーが第一ワードにきて、そいつからサイズも特定できるっぽい
- さすがにこれは真似できない
- ↑をなんとかするためにメモリブロック+ヘッダという構造を導入
- サイズとフォーワードチェック用の構造体
- フォーワードチェック用に1ビット、残りはファイナライザを詰める
- アライメントの関係上2ワード取るようにする
- 32ビットなら8バイトの無駄
- でも、ファイナライザもいれないといけないしということで妥協
- スタックの底は頑張ってOSコールで取るようにした
- データセグメントは_data_startとかで頑張る
- Windowsはどうしようかね?
- 前に書いたハックで頑張るか
- Cygwin上のmmapについて
- MAP_NORESERVEを指定しないようにした
- 512MB必要としているので、Cygwinのメモリだとスワップ領域を確保しないときついはず、ということで
主な開発環境はCygwinなので、とりあえずの妙な挙動はCygwinということになる。っで、妙な挙動。
静的領域を取るためにCygwinでは_data_start__系の値を使うのだが、GDB上で見ると正しく取れているように見えるんだけど、実際には意味不明な値が飛んできている。 たとえば、GDB上では開始アドレスは0x6a5a4000となっているんだけど、実際には0x3000とどう見てもアドレスに見えない値が取れている。
追記:
多分メモリ破壊的な何かが起きてる感じである。最初のGCではOKなのに2回目で死んでる。
追記の追記:
単にアホなミスであった。まず自分から疑うべきである・・・
*1 参考=コピペとも言う。コピペプログラマは適当にアジャストするのも得意なのであるw
No comments:
Post a Comment