API->封装例程->系统调用->系统调用处理程序->服务例程
有一张很有名的图:
总结起来就是:
系统调用xxx,对应的服务例程名sys_xxx。
write()对应汇编:
mov 调用号,eax;
mov fd,ebx;
mov buf,ecx;
mov count,edx;
int 0x80h
由上可以看出:
1.系统调用可以通过0x80h进行软中断。
0x80叫做系统调用号,其他中断号用户进程是调用不了的。
2.传递参数:可以通过寄存器传递。
这个为什么叫软中断,而不叫陷阱?
syscenter命令也可以进入内核态,但是这个命令是在penium II之上的cpu才有这个命令,所以我的没有这个命令,就不讨论这个了。
数据结构:
sys_call_table[256];
每一个数组里面放的是服务例程的入口地址,我猜测是4字节的虚拟地址。
int $0x80执行过程: