2016-05-15 6 views
2

OS Xの.kextファイルには、longjmp/setjmpが必要です。残念ながら、XNUにこれらの機能が正式にサポートされているとは思えません。これがうまくいかない、または今実装されていない根本的な理由はありますか?XNU/Darwinカーネルのsetjmp/longjmp

どのように私はこれを動作させることができる任意のアイデア?

OS XカーネルでLuaを実行しようとしていますが、ランタイムはlongjmp/setjmpまたはC++例外のいずれかがXNUでは使用できないように見えます。

答えて

1

setjmp/longjmpの標準に準拠した使用については、カーネルコンテキストでの使用を中止します。カーネルの実行コンテキストに関して注意すべき主な点は、通常、現在のスレッドは現在のスタックポインタ上のポインタ算術によって識別されるため、ユーザ空間とは異なり、緑のスレッドを使用することはできません。 x86-64では)。 longjmpはスタックポインタを設定しますが、これはsetjmpによって以前に保存された値にのみ適用されます。これは、標準的な使用法を採用すれば同じスタックに格納されるため安全です。

私が知る限り、コンパイラはsetjmp()呼び出しを特別に扱わないので、アセンブリ言語の関数として独自のバージョンを非常に簡単に実装できます。 Setjmpは、関数に渡されたjmp_buf型の配列に戻りポインタ、スタックポインタ、および呼び出し先保存レジスタを保存する必要があります。これらのすべては問題のプラットフォームのABI(OS Xの場合はx86-64 sysv)で定義されています。その後、0を返します(x86-64ではraxを0に設定します)。あなたのバージョンのlongjmpは、この配列の内容を復元し、渡された値を戻り値として持つ保存された場所に戻るだけです(x86-64では引数をraxにコピーしてください)。標準に準拠するには、longjmpに0が渡された場合は1を返す必要があります。

通常、setjmp/longjmpはシグナルマスクにも影響しますが、これはカーネルには適用されません。

+0

私は "ZFS Channel Programs"を介してカーネルにluaをロードするOSX ZFS実装に移植することを検討しているので、これについての結論にも興味があります。現在、throw()機能なしでluaをロードしますが、それは明らかに望ましくありません。 – lundman