第一代系统调用指令使用的是中断指令,
基本原理如下:
1 中断发生时,CPU会切换到特权模式并跳到内核执行预先指定的一段程序。
执行哪段程序呢,要根据中断源来决定,不同的中断源执行不同的程序,每个中断源都对应一个整数来标识自己,这个整数就叫做中断向量。
中断源有三类,外设中断、CPU异常、指令中断。
前两种都有自己的方法来指定中断向量,
指令中断是在指令的操作数里面指定中断向量号的。
我们的系统调用就是利用指令中断,用向量号0x80,也就是十进制的128当做自己的中断向量,来执行系统调用的。
2 在用户空间,先把系统调用编号赋值给寄存器EAX。
然后执行int 0x80,CPU就会跳转到内核执行内核预先设定的中断处理程序(也就是系统调用入口函数)。
系统调用入口函数根据EAX的值调用对应的系统调用函数。
系统调用函数执行完成之后返回系统调用入口函数。
入口函数再执行iret返回到用户空间,一个系统调用就完成了。