Macos XNU/Darwin内核中的setjmp/longjmp

Macos XNU/Darwin内核中的setjmp/longjmp,macos,kernel-extension,setjmp,xnu,Macos,Kernel Extension,Setjmp,Xnu,我需要OSX的.kext文件中的longjmp/setjmp。不幸的是,我认为XNU中没有对这些函数的官方支持。有没有什么根本原因导致这项计划无法实施,或者只是现在还没有实施 你知道我该怎么做吗 如果它有帮助,我想让Lua运行在OS X内核,但是运行时似乎依赖于 LojjMP < />代码> SETJMP < /C> >或C++异常,这两种异常都不在XNU中使用。 < P>没有什么标准的使用SETJMP/LoJMP,这阻止了您在内核上下文中使用它。关于内核执行上下文,需要注意的主要问题是,当前线

我需要OSX的
.kext
文件中的
longjmp
/
setjmp
。不幸的是,我认为XNU中没有对这些函数的官方支持。有没有什么根本原因导致这项计划无法实施,或者只是现在还没有实施

你知道我该怎么做吗


<>如果它有帮助,我想让Lua运行在OS X内核,但是运行时似乎依赖于<代码> LojjMP < />代码> SETJMP < /C> >或C++异常,这两种异常都不在XNU中使用。

< P>没有什么标准的使用SETJMP/LoJMP,这阻止了您在内核上下文中使用它。关于内核执行上下文,需要注意的主要问题是,当前线程通常是通过当前堆栈指针上的指针算法来标识的,因此与用户空间不同,您不能使用绿色线程或以其他方式弄乱rsp寄存器(在x86-64上)。longjmp确实设置了堆栈指针,但只设置了setjmp之前保存的值,如果您坚持使用标准用法,它将位于同一个堆栈中,因此这是安全的

据我所知,编译器并不专门处理setjmp()调用,所以您可以很容易地将自己的版本作为汇编语言中的函数来实现。Setjmp需要将返回指针、堆栈指针和任何被调用方保存的寄存器保存到传递到函数中的jmp_buf类型数组中;所有这些都是在相关平台的ABI中定义的(对于OSX,是x86-64 sysv)。然后返回0(在x86-64上将rax设置为0)。您的longjmp版本只需恢复此数组的内容并返回到保存的位置,将传入的值作为返回值(将参数复制到x86-64上的rax)。为了符合标准,如果将0传递给longjmp,则必须返回1


在用户空间中,setjmp/longjmp通常也会影响信号掩码,这不适用于内核。

巧合的是,我正在考虑通过“ZFS通道程序”移植到OSX ZFS实现,这将lua加载到内核中,因此我也对这一结论感兴趣。目前它加载lua时没有throw()功能,但这显然是不可取的。