系统调用与API
普及:现代操作系统中程序本身是 没有权利访问过多系统资源 的,为了防止程序访问冲突,操作系统将可能产生冲突的系统资源给 保护起来
普及:每个操作系统都会提供 一套接口,以供应用程序使用,这些接口往往通过 中断 来实现,比如 Linux 使用 0x80 号中断作为系统调用的入口,Windows 采用 0x2E 号中断作为系统调用入口
系统调用的弊端
使用不便,操作系统提供的系统调用接口往往过于原始,程序员需要了解很多与操作系统相关的细节
各个操作系统之间系统调用不兼容,定义和实现都不大一样
为此:运行时库将不同的操作系统的系统调用包装为统一固定的接口,使得童颜的代码,在不同的操作系统下都可以直接编译,并产生一致的效果,这就是源码级上的可移植性
系统调用的原理
用户态 和 内核态:现代操作系统的CPU在不同特权级别下执行不同的指令,称之为 用户模式(User Mode) 和 内核模式(Kernel Mode)
系统调用 是运行在内核态的,而 应用程序 基本都是运行在用户态的
操作系统一般通过 中断 来从用户态 切换 到内核态,中断是一个硬件或软件发出的 请求,要求 CPU 暂停当前的工作 转手去处理 更加重要的事情
中断的两个属性:中断号(Interrupt Number)(中断类型) 和 中断处理程序(Interrupt Service Routine)(既然中断了就要告诉CPU去干什么)
中断向量表(Interrupt Vector Table):是个数组,第 n 项包含了指向第 n 号中断的中断处理程序的 指针
中断的流程:当中断到来时,CPU 会暂停当前执行的代码,根据中断号,在中断向量表中找到对应的中断处理程序,并调用它。中断处理程序执行完成之后,CPU 会继续执行之前的代码
硬件中断 和 软件中断:硬件中断通常来源于硬件的异常或其他事情的发生,软件中断通常是一条 指令(i386 下是 int),带有一个参数记录中断号,使用这条指令用户可以手动触发某个中断并执行其终端处理程序,比如 int 0x80 会调用第 0x80 号中断的处理程序
Windows API
Windows API 是以 DLL 导出函数的形式暴露给应用开发者的,规模上非常庞大,其中一个头文件 “Windows.h” 包含了核心部分
基本服务:kernel32.dll、图形设备接口:gdi32.dll、用户接口:user32.dll、高级服务:advapi32.dll、通用对话框:comdlg32.dll、通用控件:comctl32.dll、Shell:shell32.dll、网络服务:ws2_32.dll