操作系统系列九 ——系统调用和API"/>
操作系统系列九 ——系统调用和API
往期地址:
- 操作系统系列一 —— 操作系统概述
- 操作系统系列二 —— 进程
- 操作系统系列三 —— 编译与链接关系
- 操作系统系列四 —— 栈与函数调用关系
- 操作系统系列五 —— 目标文件详解
- 操作系统系列六 —— 详细解释【静态链接】
- 操作系统系列七 —— 装载
- 操作系统系列八 ——动态链接
本期主题:
系统调用
系统调用
- 1.系统调用
- 1.1 什么是系统调用
- 1.2 Linux系统调用
- 1.3 直接使用系统调用的问题
- 2.系统调用原理
- 2.1 特权级与中断
1.系统调用
我们之前已经介绍过程序的链接、运行库,现在已经到了用户层面和内核层面的界限,也就是常说的系统调用(system call)
。
1.1 什么是系统调用
在现代操作系统中,程序运行的时候本身是没有权利访问系统资源的。
因此为了让应用程序
- 有能力访问系统资源
- 并且程序能借助操作系统做一些系统支持的行为(例如固定时间的延时接口,而不需要考虑硬件平台)
这些接口往往通过中断来实现,比如Linux使用0x80号中断作为系统调用入口, windows采用0x2E号作为中断作为系统调用入口。
1.2 Linux系统调用
linux下常见的系统调用
名字 | 含义 |
---|---|
exit | 退出进程 |
fork | 复制进程 |
read | 读文件 |
write | 写文件 |
open | 打开文件 |
close | 关闭文件 |
… | … |
1.3 直接使用系统调用的问题
既然系统调用能直接实现应用程序与内核交流的工作,那么为什么还需要用库呢?原因如下:
- 直接使用系统调用不方便。 直接使用系统调用意味着开发者也需要懂一些底层知识才能正确使用,例如存储器件需要怎么存储,物理特性是什么样的,这样开发成本就更高了;
- 各个操作系统之间系统调用不兼容。 例如读一个文件,如果使用C的标准库就是fread函数,但是使用系统调用的话,
linux下是read系统调用,而windows下是ReadFile这个API
,很难保持各个平台之间的兼容性;
2.系统调用原理
2.1 特权级与中断
现代操作系统中,通常有2种特权级别,分别为用户模式(user mode)与内核模式(kernel mode),称为用户态和内核态。
应用程序一般运行在用户态,系统调用运行在内核态,那么用户态的应用程序怎么能调用到内核态的程序呢?
操作系统通过中断
来实现这一过程,使用户态切换到内核态。
- 中断有两个属性,一个是中断号,一个是中断处理程序;
- 内核中有一个中断数组,这个数组被称为中断向量表,当中断来临时,CPU会暂停当前执行的代码,根据中断的中断号,在中断向量表中找到对应的中断处理程序并调用;
下面就是一个中断例子:
更多推荐
操作系统系列九 ——系统调用和API
发布评论