- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在阅读 Linux 上的 VM 处理。显然要执行系统调用,在 x86 上有一个位于 0xFFFFF000 的页面。称为 vsyscall 页面。过去,调用系统调用的策略是使用 int 0x80。这个 vsyscall 页面策略是否仍在后台使用 int 0x80,或者它是否使用了不同的调用策略(例如系统调用操作码?)。附带问题:int 0x80 方法是否过时?
最佳答案
如果您在现代 Linux 二进制文件上运行 ldd
,您会看到它链接到名为 linux-vdso.1
(在 amd64 上)或 linux-gate.so.1
(在 x86 上),位于该 vsyscall 页面中。这是内核提供的共享库,映射到每个进程的地址空间,其中包含封装了如何执行系统调用的细节的 C 函数。
这种封装的原因是执行系统调用的“首选”方式可能因机器而异。中断 0x80 方法应该始终适用于 x86,但最近的处理器支持效率更高的 sysenter
(Intel) 或 syscall
(AMD) 指令。您希望您的程序在可用时使用它们,但您还希望相同的编译二进制文件在 Intel 和 AMD(以及其他)处理器上运行,因此它不应包含特定于供应商的操作码。 linux-vdso
/linux-gate
库将这些特定于处理器的决策隐藏在一致的接口(interface)之后。
有关详细信息,请参阅 this article .
关于通过 vsyscall 页面的 Linux 系统调用策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23785833/
我在 StackOverflow 和其他地方看到了很多与此类似的问题,但没有一个直接解决我的问题。我正在 THREE.js 中使用凸包生成器生成 n 边多面体。我想将方形纹理映射到每个多面体的每个面上
我是一名优秀的程序员,十分优秀!