①用户在应用程序中调用printf()函数,此时执行访管指令INT Ox80产生编程异常,系统进行中断处理,处理器从用户态切换到系统态并保存中断时CPU现场信息,并使堆栈切换到内核栈。
②查找中断描述符号表,得到异常的中断处理程序的入口地址。
③执行system-call()函数,继续保护中断现场信息并检查本次系统调用的正确性。若通过检查,则利用EAX寄存器传递过来的系统调用号查找系统调用入口表,找到这个系统调用的服务例程的入口地址。
④执行write()服务例程。
⑤恢复被中断进程的CPU现场信息,返回被中断进程,继续运行。
正确答案:
系统调用也叫程序接口,是应用程序请求OS内核完成某功能时的一种过程调用,是用户程序对OS内核功能进行调用的一种手段。
Linux中系统调用的处理过程如下:
1)首先有封装例程设置系统调用功能号和参数,并存到相应寄存器中;
2)执行封装例程中的int 0x80指令,系统产生软中断(或陷入),由中断硬件完成部分现场信息保护:PSW的值和PC寄存器的值;并通过中断向量转向一个中断处理程序system_call()完成其他CPU现场信息的保存:如陷入类型、参数表指针、其他CPU寄存器的值等;
3)使用系统调用功能号查找系统调用入口表,找到相应系统调用的服务例程的入口地址sys_printf();
4)执行系统调用服务例程sys_printf(),完毕后返回执行成功与否以及成功时的执行结果给调用者;恢复被中断进程或新调度进程的CPU现场,返回被中断进程或新调度进程执行。
评分标准:概念正确1分;处理过程每项内容1分。