这一章开始学习系统调用的有关内容,在linux内核分析中,系统调用是绕不去的一个坎。下面就是我这周的读书感受。
一.几个重要的基本概念
API:系统调用在用户空间和硬件设备上添加了一个中间层(应用编程接口API),这个层的主要作用如下:1首先为用户空间提供了一种硬件的抽象接口。2.保证系统的稳定和安全3.系统调用是用户访问内核的唯一手段:除异常和陷入外
系统调用号:每个系统被赋予了一个系统调用号,一旦分配就不能有变更,这个表被存储在arch/i386/kernel/syscall.64.c当中。
系统调用处理程序:通过软中断的方式,引发一个异常来促使系统切换到内核态处理应用程序
二.系统调用的几个重要思想
Unix的接口有一句格言:“提供机制而不是策略。”
三.系统调用的具体过程:
有了用户态和内核态的基本知识了解之后,我们可以以系统调用为例,看一看中断具体是怎么执行的
系统调用的意义:
操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用
把用户从底层的硬件编程中解放了出来
极大地提高了系统的安全性
使用户程序具有可移植性:用户程序与具体硬件已经被抽象接口所替代
操作系统提供的API和系统调用的关系
API(应用程序编程接口)和系统调用:
应用编程接口和系统调用是不同的:
1.API只是一个函数定义
2.系统调用通过软中断向内核发出了一个明确的请求
Libc库定义的一些API引用了封装例成,唯一目的就是发布系统调用
1.一般每个系统调用对应一个封装例程
2.库函数再用这些封装例程定义出给用户的API(把系统调用封装成很多歌方便程序员使用的函数)
不是每个API都对应一个特定的系统调用)
API可能直接提供用户态的服务 如:一些数学函数
1.一个单独的API可能调用几个系统调用
2.不同的API可能调用了同一个系统调用
返回值
大部分封装例程返回一个整数,其值的含义依赖于相应的系统调用
-1在多数情况下表示内核不能满足进程的请求
Libc中定义的errno变量包含特定的出错码
系统调用的工作过程: