https://0xinfection.github.io/reversing/pages/part-22-asm-program-1-moving-immediate-data.html
虽然文章给了很多信息,但对某些核心的要点表述太多,还好我有文心一言
内存空间
linux系统的内存空间分为:USER SPACE 和 LINUX KERNEL SPACE
其中,汇编产生的程序,其运行时的内容都在USER SPACE,int 80h在这里出现
其工作流程是:
- 准备参数:
%eax
寄存器:用于存放系统调用号,即要执行的系统调用的唯一标识符。%ebx
、%ecx
、%edx
等寄存器:用于按顺序存放系统调用所需的参数。对于需要超过三个参数的系统调用,可能还会使用%esi
、%edi
和%ebp
寄存器,或者在内存中分配空间并通过寄存器传递指向该空间的指针。
- 保存上下文,例如USERSPACE里的下一条指令,FLAGS和重要的寄存器数据,它们都会推送到栈里
- 跳转到中断描述符表(IDT)(或者中断向量符表)的第0x80项:中断服务例程(ISR)(下面有解释👇)
- 根据寄存器的内容,执行特定的系统调用
- 执行完之后,从内核态转到用户态 这个过程叫IRET
- pop被保存的上下文,即来到int80h下的第一条指令
中断向量符表
Interrupt Descriptor Table
其前身(不确定)Interrupt Vector Table
在内存的最底部,段地址和偏移地址都为0的地方,存在名为Interrupt Vector Table的数据结构
其包含256个条目,每个条目有4bytes,每个条目都是一个内存地址称为中断向量
其中第0x80项:中断服务例程(ISR)会读取%eax
寄存器中的系统调用号,并根据该号码查找并调用相应的系统调用处理函数
总结
int 80h是进行系统调用的方法