(toppers-users 594) Re: linux のシグナルスタックに関して

Shinya Honda honda @ ertl.ics.tut.ac.jp
2002年 11月 2日 (土) 01:24:47 JST


中野様

豊橋技術科学大学の本田です.

- Shinichi Nakano <nakano @ tech.khi.co.jp>-san writes ---
> 中野と申します。
> 
> LINUXシミュレータのシグナルスタックに関して、
> シグナルスタックを,プロセススタック上に取ることになっていて、
> config/linux/start.c のmain()では、
>   action.sa_flags   =  SA_ONSTACK;
> と設定していますが、
> config/linux/cpu_config.c のcpu_initialize()では、
>   dis_action.sa_flags   =  0;
> という設定になっています。

** Cut quoted 1 lines by the mail filter. **

config/linux/start.c では,kernel_startをシグナルスタック(割込みコンテ
キスト)で呼び出すために action.sa_flags を SA_ONSTACK に設定しています.

一方 config/linux/cpu_config.c の cpu_initialize() では、ディスパッチャ
をSIGUSR1で呼び出すように設定しています.ディスパッチャーは,タスクの
コンテキストをsetjmp()で保存するため,スタックをシグナルスタックに切り
替えずにタスクのスタックのまま呼び出す必要があります.そのため,
dis_action.sa_flags   =  0; としてシグナルスタックを使わないようにして
います.

> 
> でも、当方で作ったテストプログラムは、vineでは動いたのです(!)が、
> redhatでは、segmentation faultしてしまいました。
> 
> そこで、上記のcpu_config.cで
>  dis_action.sa_flags   =  SA_ONSTACK;
> としたところ、正常に動作しました。

おそらく,segmentation faultしている理由はログタスクのスタックサイズが
不足しているためだと思われます.
#私の環境(Debian 3.0(2.4.17))ではこれが原因で落ちていました.
./include/logtask.h の
#define LOGTASK_STACK_SIZE  1024
を倍の
#define LOGTASK_STACK_SIZE  2048
に変更すると動作すると思います.


-------------------------------------------------------
本田 晋也(Shinya Honda)
豊橋技術科学大学 工学研究科 電子情報工学専攻  高田研究室   
E-mail  honda @ ertl.ics.tut.ac.jp               
WWW     http://www.ertl.ics.tut.ac.jp/~honda