0
点赞
收藏
分享

微信扫一扫

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

船长_Kevin 2022-03-11 阅读 55

往期地址:

  • 操作系统系列一 —— 操作系统概述
  • 操作系统系列二 —— 进程
  • 操作系统系列三 —— 编译与链接关系
  • 操作系统系列四 —— 栈与函数调用关系
  • 操作系统系列五 —— 目标文件详解
  • 操作系统系列六 —— 详细解释【静态链接】
  • 操作系统系列七 —— 装载
  • 操作系统系列八 ——动态链接

本期主题:
系统调用


系统调用


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),称为用户态和内核态。
应用程序一般运行在用户态,系统调用运行在内核态,那么用户态的应用程序怎么能调用到内核态的程序呢?
操作系统通过中断来实现这一过程,使用户态切换到内核态。

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

举报

相关推荐

0 条评论