操作系统接口
一、应用程序(用户)得以与计算机交互的原因:os提供了printf,fork,exec等函数(接口)。
问题:1)提供哪些系统调用?2)图形用户接口(GUI)怎么调用?
二、实现系统调用
1、将内核程序和用户程序隔离----硬件实现了内核态可以访问任何数据,用户态不能访问内核数据。因为CS:IP是当前指令,所以用CS的最低两位来表示:0是内核态,3是用户态。
2、硬件提供了”主动进入内核的方法“------中断指令int
int指令将CS中的CPL(用户段)改成0,”进入内核“,这是用户程序发起调用内核代码的唯一方式。
实现过程:
1)用户程序中写上一段包含int指令的代码
2)OS写上中断处理的代码,获取想调程序的编号
3)OS根据编号转去执行相应的代码
如 应用程序printf()的实现:首先printf()在C函数库中调用printf(),write(),库函数write()调用OS内核write()。
C函数库中的write()的CPL为3,当系统调用OS内核write()(int 0x80 ,DPL=3, eax=4 系统调用号)后,CPL=0,然后
就可以访问内核态的数据了。
set_system_gete用来设置int 0x80的中断,是用户程序与内核程序的过渡代码。在这里DPL=3------处理IDT表,CPL=0。
_system_call为中断处理程序:这个程序的作用是根据系统调用号找到相应代码。system_call_table+4*%eax就是相应系统调用处理函数入口。
当IDT表处理完成之后程序的级别就发生了改变。
问题:1)int 0x80指令是在用户态还是内核态?用户态
2)int 0x80与内核态之间的参数传递,与CPL,DPL级别的转化?CPL由3变为0,DPL由0变为3
3)int 0x80到底是指令还是地址?int 0x80指的到底是什么?不清楚
4)set_system_gate处理IDT表的过程是怎样的?不清楚
5)system_call是怎么样找到系统调用处理函数入口的?system_call_table是什么?有什么作用?不清楚