(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