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

system hung-up(No.2)



斉藤と申します。
早速のお返事ありがとうございます。

> 1.5C の newsmips (NEWS5000) で試してみましたが、帰ってこない
> ものの、それ以外の悪影響はないようでした。^C すれば止まります。

> R3000 の pmax (NetBSD-1.5_ALPHA2) で試してみましたが、
> こちらも ^C を押せば戻ってきます。ハングアップはしません。
> mips1 だともともと関係ないのかもしれませんが。

1.5では問題がないとのことですが、もう少しだけこの件について、報告させて下さい。

#include <signal.h>

main()
{
	char *p = 0;

	signal(SIGSEGV, SIG_IGN);
	*p = 0;
}

上記のプログラムを実行すると *p = 0; のアセンブラ命令 "SB $0,0x0($2)"
を再実行して、繰返しtrapが発生します。つまり、この一命令のみが
ユーザモードでの実行で、カーネルに飛び込んでからのすべての命令はカーネル
モードでの実行となります。カーネルの中は割り込みが許可されますが、
ユーザモードでタイマなどの割り込みが発生する確立はほとんどないと思われます。

ここで問題になるのが、ソフト割り込みの処理で、細かい話は省略しますが、
trap.cの中で、trap()の関数の最初のところで、

        if (status & ((CPUISMIPS3) ? MIPS_SR_INT_IE : MIPS1_SR_INT_ENA_PREV))
                splx((status & MIPS_HARD_INT_MASK) | MIPS_SR_INT_IE);

のプログラムにより、ソフト割り込みの割り込み許可ビットを落していますから、
casueレジスタを使った、ソフト割り込みが入らなくなります。

hardclock(frame)
{
....
        if (needsoft) {
                if (CLKF_BASEPRI(frame)) {
                        /*
                         * Save the overhead of a software interrupt;
                         * it will happen as soon as we return, so do it now.
                         */
                        (void)splsoftclock();
                        softclock();
                } else
                        setsoftclock();
        }
....
}

(この場合は、setsoftclock()が呼ばれます。)

hardclock()の関数が何回呼ばれてもsoftclock()が呼び出されないため、
ハングアップ状態となります。ただし、割り込みは通常に入りますし、
割り込みによっては、softclock()が呼び出されることがあるようで、
プログラムの強制終了が行なえる場合があるようです。

とりあえず、trap.cのtrap()関数の、

        if (status & ((CPUISMIPS3) ? MIPS_SR_INT_IE : MIPS1_SR_INT_ENA_PREV))
                splx((status & MIPS_HARD_INT_MASK) | MIPS_SR_INT_IE);

をコメントにすると症状はなくなります。でも理由があって、
このプログラムがあるのでしょうから、何かまずいことがあるかも知れません。

1.5では対策がなされているのかもしれませんね。

以上、よろしくお願い致します。