[Mona] オーストリア人の開発者からツッコミが来た(システムコールはプリエンプティブか?)

昨日のバグを指摘してくれた彼からさらに別のツッコミが。
せっかくなのでメールを引用して紹介します。もちろん彼の許可は取ってあります。
オーストリア人なので母国語はドイツ語ですが、英語でメールを送ってくれました。

I've rewriten my pagefault and syscall Handlers to be preemtible. This
sadly produced very strange bugs for me :(


(Monaのコードの一部を母体として)、ページフォルトシステムコールハンドラをプリエンプティブにしたが、どうも動きがおかしいと。
プリエンプティブとは、処理が横取り可能という意味で、この場合はシステムコール実行中に割り込み等を受け付けることを指します。

One thing you should watch out for is to restore the tss->esp0 when you
return from the syscall and the pagefault handler.

(I actually didnt look at the whole mona source so I dont know if you
handlers are preemtible or not).


システムコールや、ページフォルトから復帰する際の tss->esp0(カーネルスタック)のリストアに着目すべきだ。(コードを全部読んだわけではないので、プリエンプティブかどうかは知らないけどね)

Basically in the handler epiloge I now turn off the interrupts and then
write back the tss->esp0 and then exit as usual.
Otherwise on the next interrupt you might be using a wrong kernel stack,
or even worse trash a different kernel stack.


今は、ハンドラの最後で割り込み禁止にして、tss->esp0を戻して終了している。
そうしないと、次の割り込みで不正なカーネルスタックを使ってしまうか、さらに運が悪いと、違うカーネルスタックを壊してしまうだろう。


とのこと。
過去のある時期のMonaシステムコールはプリエンプティブだったと思う。
そうでなければディスクI/Oを伴うシステムコールを実行したら、その間何もできなくなってしまう。
ただ、現在のMonaはディスクI/Oをユーザー側に追い出してしまったので、プリエンプティブかどうかを検証するコードが残っていないのである。
というわけで、ちょっと調べてみようと思います。


これがカーネル改善のきっかけになりそうな予感。


さてこれは余談だが、オーストリア人の彼は以下のような経歴。
若いのにとても優秀です。

I'm 23 years and studying Computer Science.
And besides studying I'm working full time as a software developer for a
company making Computational Fluid Dynamics software.

Well, I've been playing around with computers since I was 10 or so ;)