我正在阅读Linux上的VM处理。显然,为了执行系统调用,在x86上有一个0xFFFFF000的页面。叫做vsyscall页面。在过去,调用系统调用的策略是使用int 0x80。这个vsyscall页面策略是否仍在使用int 0x80,或者它是否使用不同的调用策略(例如syscall操作码?)。附带问题:int 0x80方法是否已过时?
答案 0 :(得分:1)
如果您在现代Linux二进制文件上运行ldd
,您会发现它已链接到名为linux-vdso.1
的动态库(在amd64上)或linux-gate.so.1
(在x86上),位于该vsyscall页面中。这是内核提供的共享库,映射到每个进程的地址空间,其中包含C函数,这些函数封装了如何执行系统调用的细节。
这种封装的原因是"首选"执行系统调用的方式可能因机器而异。中断0x80方法应始终适用于x86,但最近的处理器支持sysenter
(英特尔)或syscall
(AMD)指令,这些指令效率更高。您希望程序在可用时使用这些程序,但您也希望在Intel和AMD(和其他)处理器上运行相同的已编译二进制文件,因此它不应包含特定于供应商的操作码。 linux-vdso
/ linux-gate
库将这些特定于处理器的决策隐藏在一致的界面背后。
有关详细信息,请参阅this article。