操作系统系列九 ——系统调用和API

往期地址:

本期主题:
系统调用



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会暂停当前执行的代码,根据中断的中断号,在中断向量表中找到对应的中断处理程序并调用;

下面就是一个中断例子:
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值