在我们的操作系统中,已经存在的3个进程是运行在ring1上的,它们已经不能任意地使用某些指令,不能访问某些权限更高的内存区域,但如果一项任务需要这些使用指令或者内存区域时,该怎么办呢?这时候只能通过系统调用来实现,它是应用程序和操作系统之间的桥梁。
换句话说,应用程序的能力是有限的,很多事情做不了,只能交给操作系统来做。系统调用就是告诉操作系统: “我有一件事,请你来帮我来完成。”
所以,一件事情就可能是应用程序做一部分,操作系统做一部分。这样,问题就又涉及特权级变换。
现在,假设进程P想得到当前的ticks,就问操作系统: “OS先生,请问当前的ticks是多少?”然后OS先生低头在 自己的记录本中查找了一下,然后告诉P: “当前的ticks是1234。”
系统调用,使用汇编语言编写调用int软中断,syscall.asm
get_ticks:
mov eax, _NR_get_ticks
int INT_VECTOR_SYS_CALL
ret
设置中断处理程序,同一个中断不同功能的eax对应不同的处理函数,也是使用汇编语言编写
init_idt_desc(INT_VECTOR_SYS_CALL, DA_386IGate, sys_call, PRIVILEGE_USER);
; =====================================================
; sys_call
; =====================================================
sys_call:
call save
sti
call [sys_call_table + eax * 4]
mov [esi + EAXREG - P_STACKBASE], eax //C语言使用eax保存返回值
cli
ret
//不同的处理函数设置为数组的不同元素
PUBLIC system_call sys_call_table[NR_SYS_CALL] = {sys_get_ticks};
不同的处理函数使用C语言编写:
/*===========================================================*
sys_get_ticks
*===========================================================*/
PUBLIC int sys_get_ticks()
{
return ticks;
}