=================================================================== RCS file: /home/cvs/OpenXM/src/asir-doc/int-parts/port.texi,v retrieving revision 1.1 retrieving revision 1.2 diff -u -p -r1.1 -r1.2 --- OpenXM/src/asir-doc/int-parts/port.texi 2001/04/23 05:45:35 1.1 +++ OpenXM/src/asir-doc/int-parts/port.texi 2003/04/19 10:36:29 1.2 @@ -1,4 +1,4 @@ -@comment $OpenXM$ +@comment $OpenXM: OpenXM/src/asir-doc/int-parts/port.texi,v 1.1 2001/04/23 05:45:35 noro Exp $ @chapter 移植 @code{risa} は大部分 C により書かれているが, 多倍長演算部の一部はアセ @@ -117,114 +117,3 @@ DATASTART @noindent とする. - -@section インクリメンタルローディング(ASIR) - -@code{ASIR} では, リロケータブル object (@code{xxx.o}) を実行中に -ロードできる. この機能は, @code{UNIX} 版では @code{KCL} (Kyoto Common -Lisp) で用いられている方法を参考にして実現されている. -(@samp{parse/load.c} の @code{loadaoutfile()}. ) これは, @code{ld} -(link editor) のインクリメンタルローディング機能を用いている. -@code{ld} がこの機能を持たない場合は何らかの手段が必要となる. -@code{KCL} では, リンクエディタを別に用意することで対応している. -@code{ld} がこの機能を持つ場合にも, object ファイルのヘッダの形 -式の違いにより変更が必要になる場合もある. 基本的には次の一連の操作を行 -なう函数を書けばよい. - -@enumerate -@item -ロードすべきファイルを @code{ld} によりインクリメンタルロードする. こ -れは, リンク後の object のサイズを調べるためのロードである. -@item -1. でできた object 用の領域を確保する. この領域の先頭ポインタは, -GC で回収されるのを防ぐため, ヒープ領域から始まるリストに繋ぐ. -@item -2. で得たポインタをプログラム領域の先頭アドレスとして, 改めてロードす -る. -@item -3. でできた object を 2. で確保した領域上に読み込む. -@item -ロード可能な object の先頭は, そのファイルに含まれる函数を -@code{ASIR} に登録するための函数となっているので, それを呼び出す. -@end enumerate - -@code{mips} を CPU とするマシンでは, ロードされる object をコンパ -イルする際にやや特殊な注意を要する場合がある. ここでは -@code{DECStation} を例にとり説明する. @code{mips} では, 函数呼び出しは - -@example -jal function -@end example - -@noindent -とコンパイルされる. しかし, @code{jal} は, 現在のプログラムカウンタの -上 4bit を飛び先アドレスの上 4bit として使うため, @code{function} の -アドレスの上 4bit が現在のプログラムカウンタの上 4bit と一致しないと呼 -び出しできない. 上記のような方法でインクリメンタルロードした場合, オブ -ジェクトはヒープに置かれることになるが, @code{DECStation} の場合, 元の -プログラム領域と, ヒープでは, 上 4bit が異なる. よって, 普通にコンパイ -ルした object はロードできない. コンパイラおよびアセンブラでこれを -解消する方法が今の所見当たらないので, 次のような方法をとることにした. -すなわち, @code{cc -S} でアセンブラのソースを出し, - -@example -jal function -@end example -@noindent -を -@example -.set noat -la $at,function -jal $at -.set at -@end example - -@noindent -に書き換えて, アセンブルすることとした. (実際には, @code{cc}, -@code{as} 共に @samp{-G 0} なるオプションが必要である. また, @code{as} -の 警告メッセージを消すためには, @samp{-w} なるオプションを付ける. ) -この書き換えは, 次の @code{awk} スクリプトにより行なわれる. - -@example -{ - if ( $1 == "jal" && substr($2,0,1) != "$" ) - printf "\t.set\tnoat\n\tla\t$at,%s\n\tjal\t$at\n\t.set\tat\n",$2 - else print -} -@end example - -@noindent - -この修正は, @code{mips} を CPU とする他のマシン (@code{RISC NEWS} など) -に対しても必要であると思われる. - -@section NeXT への移植 - -これまで @code{UNIX} 上での移植作業について述べてきたが, @code{NeXT} -は @code{Mach} を OS とするマシンであり, GC, インクリメンタルローディ -ングなどより OS に依存する部分では通常の @code{UNIX} と異なる部分が出 -てくる. それらについて述べる. - -@subsection メモリ管理 - -@code{UNIX} と @code{Mach} では, OS 側の メモリ管理が大きく異なってい -る. @code{UNIX} においては, データセグメントは連続領域であり, OS に対 -する メモリの要求は, その領域を伸ばすことにより満たされる. しかし, -@code{Mach} においては, @code{vm_allocate()} なる函数により個別の領域 -として与えられ, 一般にそれら全体は連続した領域とはならない. オリジナル -の GC では, データセグメントの 先頭, 末尾だけを知って, その間を全て -検査するが, @code{Mach} の場合, このままではアクセス違反を起こす可能性 -がある. これらを考慮して, @code{NeXT} 版では次のような変更を行なった. - -@enumerate -@item -オリジナルで @code{brk()}, @code{sbrk()} で書かれている部分を -@code{vm_allocate()} を使って書き直した. -@item -効率低下を招く恐れはあるが, @code{vm_allocate()} で得た領域の上下限の -リストを保持し, ある数が妥当なポインタであるか否かのチェックの際に, こ -のリストによるチェックも行なうようにした. -@end enumerate - -@noindent -これらの変更は, その他の @code{Mach} マシンにも通用すると思われる.