首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XNU/达尔文内核中的setjmp/longjmp

XNU/达尔文内核中的setjmp/longjmp
EN

Stack Overflow用户
提问于 2016-05-15 15:39:44
回答 1查看 249关注 0票数 2

我需要XNU的longjmp/setjmp文件中的.kext文件。不幸的是,我认为XNU中没有对这些函数的任何官方支持。这是否有根本的原因不能起作用,还是现在还没有实现呢?

有什么办法能让这件事起作用吗?

如果有帮助,我想让Lua在OS内核中运行,但是运行时似乎依赖于longjmp/setjmp或C++异常,这两种异常在XNU中都是不可用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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通常也会影响信号掩码,这在内核中不适用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37240243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档