[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]
[OSASK 3173] from OSASK BOARD
このメールは、OSASK伝言板に書き込まれた内容です。
この書き込みに返事を書く場合は、下のURLから書き込みを行なって下さい。
http://www.imasy.or.jp/~mone/osask/index.cgi?REFER=3c653994_12962
From: 川合秀実
Message-ID: 3c653994_12962
Date: 2002/02/10 00:00
Subject: Re: nikq::osask
[OSASK 3166]へのレスです。
>ホントはgccの使い方を間違ってますよ。
>mingwはWindows用のバイナリをはくからそれようの設定になってるんですよね。
>OSASK用にはOSASK用のgccを作るのが正しい使い方でしょう。
そのとおりです。MinGWを責めるのは不適切でした。
>(少なくとも.dataにおくのは間違いですよね)
なぜ?・・・読み取り専用だから.textに置くべきなんですか?
間違いとか正しいとかいうんじゃなくて、アーキテクチャー上の問題だと思い
ます。
本来IA-32は、コードとデーターの混合を推奨していません。そういうアーキ
テクチャーになっています。コード内のデーターを読むにはコードセグメントオ
ーバーラードプリフィックスを付けるのが基本で、これはペナルティーになりま
す。
少なくともIA-32とIA-16においては、.textセクションはコードのみを置き、
初期値のあるデーターはconstであっても.dataに置き、.bssに初期化不要なデー
ターを置きます。これが慣例であります(こうすれば高速に実行できるから)。.t
extはコードセグメントに対応し、.dataと.bssは結合してデーターセグメントに
対応します。・・・実際lcc-win32やVCでは、フラットモデルであっても、その
ようにconstなデーターを扱っています(後述の通り、フラットではこの配置にす
る必要はありませんが、おそらく伝統的な配置に従っているのだと思います)。
このルールの唯一の例外はスモールモデルとその32bit版であるフラットモデ
ルです。これらではコードセグメントとデーターセグメントがオーバーラップし
事実上セグメントを意識しないことになります。それゆえ.textセクションの内
容もペナルティーなしで読めます。コード内容はセグメンテーションによる保護
を受けず、ページング機構によってのみ保護されます。
僕が言いたいことは、今でこそフラットモデルが流行しているためにコード内
のデーターを何の苦労もなく読めることになっていますが、それはIA-32のアー
キテクチャーとしてはとても特別なことで一般的なことではありません。したが
って一般論として、読み取り専用のデーターを.text内に置くのが正しいことで
、.dataに置くのが間違っているという主張には、僕は賛成しません。
RISC系のCPUでは.textにconstなデーターを置くのが常識なのかもしれません
。僕はその辺については知りません。そういう意味でおっしゃっているのなら、
anonymousさんの主張は正しいのかもしれません。・・・しかし、それなら責め
るべきはIA-32にそのもので、コンパイラの挙動ではないでしょう。