[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:21528] Re: Linuxの割り込みについて



松本@兵庫県です。

  なんか、Plamo との関係なさそうなのに、長文で申し訳ないです。
ネタ元は、詳解 Linuxカーネル と、IO Port Programing mini HOWTO
です。興味のある方はそちらを読んだ方が勉強になると思います。

詳解 Linux カーネル 第2版 (O'REILLY, ISBN4-87311-133-1)
IO Port Programming mini HOWTO( Plamo な方は下記のファイル)
    /usr/doc/Linux-mini-HOWTOs/IO-Port-Programming.gz
    /usr/doc/JFdocs/IO-Port-Programming.txt.gz (和訳)

_Message-Id: <018a01c3bf48$080e20c0$020ba8c0@front>
_From: "H.Shiozaki" <sios_hs@yahoo.co.jp>
_Date: Thu, 11 Dec 2003 03:00:15 +0900

> 松本さんの,
> >ソース中の /* page alloc start */ から /* page alloc end */
> > の間のコメントアウトされた、部分を有効にする事です。
> のコメントが重要なヒントになりました,
> 私目の問題になったプログラムは,calloc()
> を使っていますが,イニシャライズすることによって
> 問題の時間誤差発生が解消しました。

  このようなメモリ管理に関する、Linux と FreeBSD の違いは、通常の
ユーザーには関係なさそうですが、厳しい環境で動作するサーバの管理者
は、把握していないといけないのかもしれません。
  「詳解 Linux カーネル」で解説されていますが、malloc() 等で、メモリ
を確保した時、Linux の場合は、メモリが確保されたと言う情報だけが、
OSの管理情報として登録され、物理メモリの割り当ては、行われません。
  ここに書き込みなどの動作を行うと、Page fault 例外が発生し、処理は
OS 側に移行します。この例外は、たぶんマスク不能だと思います。Linux
カーネルは、Page fault 例外を受けると、ユーザプロセスが使用できる
正当な領域であれば、物理メモリを割り当てて処理をユーザプロセスに
戻します。不正な領域であれば "Segmentation fault" 等になります。

  i386 の場合、4096Byte 単位でメモリー管理をする関係上、私が例で
示したようなプログラムだと、4096Byte 毎に Page fault が発生して
いたことになります。配列の初期化の部分は、初期化が目的ではなく
配列の全領域にわたってあらかじめ、物理メモリをマッピングしてもら
う事が目的だった訳です。

  malloc() に限らず
static int array[128*1024*1024];
の場合も同様です。上記の様に書くと、もったいないオバケが出て来そう
ですし、素人っぽく見えますが、Linux に限れば、実際に読み書きしない
限り、物理メモリの消費はありません。スタックも、プロセス実行中に、
必要に応じて拡大していきます。

  calloc() については、実は私はわかりません。手元の環境では、0 で、
初期化する際に、全ページに渡って物理メモリが割り当てられています。
libc のバージョン、build 時のオプションによって振舞が異なるので
しょうか?

> FreeBSDでは,前者(CLI/STI方式)は使えるのでしょうか。
> FreeBSDでは,iopl()はサポートしていないように思っていますが。
> また,松本さんのコードの場合,iopl()とペアで使うのが必須でしょうか?

  cli/sti は、ix86 の、CPUの割り込みを許可フラグを CLear/SeT
する命令です。当然、ユーザモードでは使用出来ません。iopl()で、特権
レベルを上げる必要があります。Linux 以外では、特権レベルを上げる、
手段があるかどうかに依存するでしょう。
  伝統的なATのPIC, Local-APIC, IO-APIC に依存せず、全割り込みがマスク
できるので便利ではありますが、割り込み源に対して個別に制御できる物
ではありません。本来 cli/sti による割り込み制御は、どうしても必要な
時に出来るだけ短い時間に限って使用するべき物です。
  余談ですが、Linux カーネル/デバイスドライバ内では、cli/sti を直接
使いません。cli(), sti() マクロを使います。シングルCPUに限れば、結局
cli/sti 命令と同じなのですが。

  私の示した例は、相当やりすぎの部類に入ります。私自身は、常用して
いるマシンでこの手のプログラムは動作させたくはありません。あくまで、
実験用と言う事で御理解願います。

-- 
松本 徳真
Norimasa Matsumoto
E-mail: matsu@netfort.gr.jp

Follow-Ups
[plamo:21560] Re: Linuxの割り込みについて, H.Shiozaki
References
[plamo:21451] Re: Linuxの割り込みについて, Norimasa Matsumoto
[plamo:21520] Re: Linuxの割り込みについて, H.Shiozaki

[検索ページ] [メール一覧]
Plamo ML 公開システム