有没有办法在不使用它们的情况下编写我自己的syscall
/ int 0x80
?所以,通常它会像
setup registers
...
syscall or int 0x80
我有兴趣在没有syscall
/int 0x80
setup registers
call mysyscall
我在哪里可以找到syscall
or 的实现int 0x80
?还是在 asm 中实现它的级别太低?
有没有办法在不使用它们的情况下编写我自己的syscall
/ int 0x80
?所以,通常它会像
setup registers
...
syscall or int 0x80
我有兴趣在没有syscall
/int 0x80
setup registers
call mysyscall
我在哪里可以找到syscall
or 的实现int 0x80
?还是在 asm 中实现它的级别太低?
TL;DR:这是CPU支持的两条指令,您不能在汇编中实现它们,因为它们是(或不是)您正在使用的汇编语言的一部分。
更多背景:
中断(汇编int
指令导致软件中断)是 CPU 的特殊事件。CPU 立即停止执行它正在执行的指令序列,保存当前执行的上下文(例如EIP
和其他控制寄存器,大多数用户无法直接访问),并切换到专门指定的代码序列,负责处理该特定中断。
硬件中断的例子与处理电源、硬盘网络和其他外围设备有关,以及当程序访问内存区域失败、某些计算失败(除以零)、浮点错误、尝试执行特权或无效指令和许多其他指令。
此外,程序可以通过使用int
接收单个操作数的指令有意触发中断- 要触发的中断 id。
当中断发生时,在中断描述符表(又名中断向量表)中的中断索引所指向的地址处恢复执行,在 的情况下int 0x80
,这0x80
显然是偏移处的地址。
由于中断对 CPU 来说是一项昂贵的操作(它需要大量与线程和上下文切换相关的簿记等),因此 AMD(以及后来的 Intel)引入了该sysenter
指令(syscall
由 Intel调用)。该指令仅通过提升到 ring0 并执行内核代码来将簿记保持在最低限度。