12.1 系统调用介绍
12.1.1 什么是系统调用
- 现代操作系统都将可能会发生冲突的系统资源(文件, 网络, IO, 设备)保护起来, 阻止应用程序直接访问
- 系统调用通过中断实现, linux 使用 0x80 中断, 而 windows 使用 0x2e 中断 作为系统调用的入口
12.1.2 Linux 系统调用
- 使用 0x80 中断, eax 存放系统调用的接口号, 同时, eax 也是调用结果的返回容器
12.1.3 系统调用的弊端
- 弊端:
- 使用不方便
- 各个操作系统之间不兼容
- 运行库 作为系统调用 与 程序之间的中间层 (保证各个平台兼容)
- 可以保证不同平台上调用的一致性 (源代码级别)
- 但是, 这个兼容性实际上是针对各个平台公共的性能
12.2 系统调用的原理
12.2.1 特权级与中断
- 通常CPU 的特权级别:
- 用户模式、
- 内核模式
- 中断需要两个属性:
- 中断号
- 中断处理程序
- 一般的中断过程:
12.2.2 基于int 的Linux 的经典系统调用实现
内核栈的切换:
需要注意的是, 系统调用参数的传入, 一般借助 ebx, ecx, edx, esi, edi, ebp 进行传递, 最多 6 个, 通过保护现场时候, 压入栈中,实现
12.3 windows api
windows api 是操作系统用于 与 内核打交道的核心功能, 通过dll 导出函数的形式提供出来
CRT 实际上是对 windows api 的进一步封装
- 通过windows api 可以隔离内核的变化