我需要XNU的longjmp/setjmp文件中的.kext文件。不幸的是,我认为XNU中没有对这些函数的任何官方支持。这是否有根本的原因不能起作用,还是现在还没有实现呢?
有什么办法能让这件事起作用吗?
如果有帮助,我想让Lua在OS内核中运行,但是运行时似乎依赖于longjmp/setjmp或C++异常,这两种异常在XNU中都是不可用的。
发布于 2016-05-17 07:22:09
与标准兼容的setjmp/longjmp的使用并没有阻止您在内核上下文中使用它。对于内核执行上下文,主要要注意的是,当前线程通常是通过当前堆栈指针上的指针算法来识别的,因此与用户空间中的情况不同,您不能使用绿色线程或以其他方式扰乱rsp寄存器(在x86-64上)。longjmp确实设置了堆栈指针,但仅指向setjmp先前保存的值,如果坚持标准使用,该值将位于同一个堆栈中,因此这是安全的。
据我所知,编译器并不专门处理setjmp()调用,因此您可以很容易地将自己的版本实现为汇编语言中的函数。Setjmp将需要保存返回指针、堆栈指针和传递到函数中的jmp_buf类型数组的任何被调用保存的寄存器;所有这些都是在有关平台的ABI中定义的(在OS的情况下是x8664 sysv )。然后返回0(在x86-64上将rax设置为0)。您的longjmp版本只需要恢复这个数组的内容并返回到保存的位置,将传入的值作为返回值(将参数复制到x86-64上的rax )。若要符合标准,如果将0传递给longjmp,则必须返回1。
在用户空间中,setjmp/longjmp通常也会影响信号掩码,这在内核中不适用。
https://stackoverflow.com/questions/37240243
复制相似问题