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

[plamo:21560] 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 が発生して
>いたことになります。配列の初期化の部分は、初期化が目的ではなく
>配列の全領域にわたってあらかじめ、物理メモリをマッピングしてもら
>う事が目的だった訳です。
私のケースでは,8バイト単位の書きこみ単位ですので,
4096/8=512で,512回毎にこの現象が発生していたので,
松本さんのおっしゃる通りです。(callocベース)

>
>  malloc() に限らず
>static int array[128*1024*1024];
>の場合も同様です。上記の様に書くと、もったいないオバケが出て来そう
>ですし、素人っぽく見えますが、Linux に限れば、実際に読み書きしない
>限り、物理メモリの消費はありません。スタックも、プロセス実行中に、
>必要に応じて拡大していきます。
>
>  calloc() については、実は私はわかりません。手元の環境では、0 で、
>初期化する際に、全ページに渡って物理メモリが割り当てられています。
>libc のバージョン、build 時のオプションによって振舞が異なるので
>しょうか?
>
>> FreeBSDでは,前者(CLI/STI方式)は使えるのでしょうか。
>> FreeBSDでは,iopl()はサポートしていないように思っていますが。
>> また,松本さんのコードの場合,iopl()とペアで使うのが必須でしょうか?

ペアで使うのが必須でした。
CLI/STIだけでは,受け付けないことを確認しました。
たしか,Segmentation Faultになったと思います。

>
>  cli/sti は、ix86 の、CPUの割り込みを許可フラグを CLear/SeT
>する命令です。当然、ユーザモードでは使用出来ません。iopl()で、特権
>レベルを上げる必要があります。Linux 以外では、特権レベルを上げる、
>手段があるかどうかに依存するでしょう。
FreeBSDでは,iopl()がないと思われます。
したがって,FreeBSDでは,この方法は使えないと思っています。

>  伝統的なATのPIC, Local-APIC, IO-APIC に依存せず、全割り込みがマスク
>できるので便利ではありますが、割り込み源に対して個別に制御できる物
>ではありません。本来 cli/sti による割り込み制御は、どうしても必要な
>時に出来るだけ短い時間に限って使用するべき物です。
>  余談ですが、Linux カーネル/デバイスドライバ内では、cli/sti を直接
>使いません。cli(), sti() マクロを使います。シングルCPUに限れば、結局
>cli/sti 命令と同じなのですが。
>
>  私の示した例は、相当やりすぎの部類に入ります。私自身は、常用して
>いるマシンでこの手のプログラムは動作させたくはありません。あくまで、
>実験用と言う事で御理解願います。
Linuxで,SYS_TYMERのON/OFF方式による1分ほどの間に
別のKterm上で,ls -lR /usrやcp -R dir1 dir2 (20MBサイス)
をやってみましたが,動作は確かにぎこちなくなったりしますが,
diff -r dir1 dir2 
で確認しましたが,一応正常でした。

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

>  i386 の場合、4096Byte 単位でメモリー管理をする関係上、私が例で
>示したようなプログラムだと、4096Byte 毎に Page fault が発生して
>いたことになります。
この説明は,助かりました。
私目のcallocを使用していないもの(PG35)と,
callocを使っているもの(Gat75)で,
タイミング誤差が,前者は無いのに,後者はあったのですが,
後者に,calloc直後にイニシャライズすることにより
後者もタイミング誤差が解消しました。
ありがとうございました。
なお,PG35は,以下に公開しています。
http://www.geocities.jp/sios_hp/gat_page/gat75ja/index.htm
- - -
汐崎:H.Shiozaki
E-Mail: sios_hs(at)yahoo.co.jp
URL: http://www.geocities.jp/sios_hp/

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

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