朱秀秀 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
通常,在OS的核心中都设置了一组用来实现各种系统功能的子程序(过程),并把它们提供给用户调用,每当用户在需要系统提供某种服务的时候,就可以利用系统调用指令去调用系统过程。在调用系统过程之后,程序运行就由用户态转到内核态,相应的栈也由用户栈,转到内核栈,并且进行了相当于保护现场的工作,把当前的状态,栈顶指针,cs:eip保存到内核栈中。通过中断进入内核态,返回的时候,需要重新调度(所以不一定直接返回到调用过程),同时通过iret操作恢复现场。
系统调用过程比较简单,它由0x80中断向量进入系统调用入口,通过使用系统调用表保存系统服务函数的地址的形式实现。具体的流程可以用下图所示:
0x80将控制传递给核心。0x80就是系统调用的一个矢量地址。这个中断矢量表是在系统启动时就初始化好的,以及一些矢量地址,如系统时钟。当用户系统调用时,执行如下:
每个系统调用都通过lib库体现。每一个系统调用在lib库中一般是一个宏syscallX(),X是具体某个调用的数字参数。有的系统调用更复杂,因为它们有可变
的参数列表,但它们仍用一样的入口指针.每个系统调用宏将展开成一个汇编段,用来建立调用的堆栈段,然后通过调用中断int $0x80调用--ENTRY(system_call).
系统调用处理过程”的理解:它由0x80中断向量进入系统调用入口,通过使用系统调用表保存系统服务函数的地址的形式实现。
时间: 2024-10-27 16:43:01