扒开系统调用的三层皮
一、用户态、内核态和中断
一般现代CPU都有几种不同的指令级别
在高级别执行级别下,代码可以执行特权指令,访问任意的物理地址,称之为内核态
在相应的低指令执行级别下,代码的掌控范围会受到限制,只能在对应级别允许的范围内活动,称之为用户态
为什么会有权限级别划分
为了让系统本身更稳定,保证代码不被误写崩溃
CS寄存器的最低两位表明了当前代码的特权级
CPU每条指令的读取都是通过CS:eip这两个寄存器
CS:代码段选择寄存器
eip:偏移量寄存器
在Linux中,地址空间是一个显著的标志,0xc0000000以上的地址空间只能在内核态下访问
地址空间指逻辑地址而不是物理地址
中断处理时从用户态进入内核态的主要方式
系统调用是一种特殊的中断
寄存器上下文——从用户态切换到内核态
必须保存用户态寄存器的上下文:要保存哪些?保存到哪里?
中断/int指令会字啊堆栈上保存一些寄存器的值中断发生后的第一件事就是保存现场
二、系统调用概述和系统调用的三层皮
系统调用的概述
系统调用的意义:操作系统为用户态进程与硬件设备进行交互提供了一组接口————系统调用
把用户从底层的硬件编程中解放出来
极大的提高了系统的安全性
使用户程序具有可移植性
操作系统提供的API和系统调用的关系
API只是一个函数调用
系统调用通过软终端向内核法术一个明确的请求
不是每个API都对应一个特定的系统调用
API可能直接通过用户态的服务
一个单独的API可能调用几个系统调用
不同的API可能调用了同一个系统调用
返回值
大部分封装例程返回一个函数,其值的含义依赖于相应的系统调用
-1在多数情况下表示内核不能满足进程的请求
Licb中定义的errno变量包含特定的出错码
系统调用号将xyz和system_xyz关联起来了
当用户态进程调用一个系统调用时,CPU切换到内核并开始执行一个内核函数
传参
内核实现了很多不同的系统调用,进程必须致命那些需要系统调用,着需要传递一个名为系统调用号的参数
系统调用的参数传递方式:
三、使用库函数API获取系统当前时间
使用C代码中嵌入汇编代码触发系统调用获取系统当前时间
总结
操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用。
其作用是:把用户从底层的硬件编程中解放出来;极大的提高了系统的安全性;使用户程序具有可移植性。