一、接口
- 用户使用计算机方式:命令行、图形按钮、应用程序
- 用户通过普通函数+关键函数(open、fork...)使用计算机
- 操作系统接口:系统调用的函数
- 系统调用:操作系统提供的函数调用
- 系统调用 <===> 接口
二、系统调用的实现
- 用户态 ---->内核态:不能随影jump,因为不安全(比如可以随意看root密码)
- 硬件设计区分用户态和内核态,保证不能随意jmp
- OS在系统初始化时,DPL设为0,即OS的DPL(代码段和数据段)都被head.s初始化为0,即GDT表象DPL=0
- 数字越小,特权越大
- DPL>=CPL 可访问
- CPL = 0 ; DPL = 0 ; CPL可访问
- CPL = 0 ; DPL = 3 ; CPL可访问
- CPL(CS)、DPL(GDT)都在段寄存器中
中断指令 int 是硬件提供的唯一可进入内核的方法
系统调用的核心:
- 用户程序包含一段int指令代码(int 0x80)
- int指令:应用程序通过库函数、宏展开为内嵌汇编代码
- OS中断处理,获取想调程序用程序的编号(system_call)
- OS根据编号执行相应代码
- OS规定只有 int 0x80 才能进入内核
- int 0x80:查IDT表,取中断处理函数执行,返回
- int 0x80 通过将IDT表中的DPL=3保证其能调用IDT表
- IDT表中CS置为8,将当前CPL变为0,从而通过int 0x80执行内核态
printf(" ")调用过程: