5.1 内核通信

系统调用在用户空间和硬件设备之间添加了一个中间层.

该层主要作用:

1.为用户空间提供了一种硬件的抽象接口.

2.保证了系统的稳定和安全.

3.每个进程都运行在虚拟系统中.

在Linux中,系统调用是用户空间访问内核的唯一手段;除异常和陷入外,它们是内核唯一的合法入口。

5.2 API、POSIX和C库

一般情况下,应用程序通过在用户空间实现的应用编程接口,而不是直接通过系统调用来编程。

一个API定义了一组应用程序使用的编程接口。

1.在Unix世界中,最流行的应用编程接口是基于POSIX标准的。

POSIX是由IEEE的一组标准组成。

2.C库实现了Unix系统的主要API,包括标准C库函数和系统调用接口。所有的C程序都可以使用C库,而其他语言也可以把他们封装起来使用。

3.Unix接口设计中,“提供机制而不是策略”,Unix系统调用抽象出了完成某种确定目的的函数。

5.3系统调用

要访问系统调用,通常通过C库中定义的函数调用来进行。它们通常都需要定义零个、一个或几个参数(输入)而且可能产生一些副作用。

系统调用还会通过一个long类型的返回值来表示成功或者错误。

通常,也不绝对,用一个负的返回值来表明错误。返回一个0值通常表明成功。

系统调用在出现错误的时候C库会把错误码写入error全局变量。通过调用perror()库函数,可以把该量编译成用户可以理解的错误字符串。

如何定义系统调用?

1.限定词。

2.函数返回。注意返回值类型。

3.系统调用在内核中被定义时有命名规则。Get_pid()为sys_getpid()。

5.3.1 系统调用号

指明要执行哪个系统调用,进程不会提及系统调用的名称。

一旦分配就不能再有变更,否则编译好的程序就会崩溃。

如果一个系统调用被删除,它所占用的系统调用号也不允许被回收利用。

Sys_ni_syscall():除了返回-ENOSYS外不做任何其他工作,这个错误号专门针对无效的系统调用而设的。

5.3.2 系统调用的性能

为什么Linux系统调用执行快?

1.Linux的上下文切换时间很短。

2.系统调用处理程序和每个系统调用本身也非常简洁。

5.4 系统调用处理程序

用户空间的程序无法直接执行内核代码。

软中断:应用程序通知系统的机制。通过引发一个异常来促使系统切换到内核态去执行异常处理程序。

5.4.1 指定恰当的系统调用

X86中,系统调用号是通过eax寄存器传递给内核的。

5.4.2 参数传递

在x86-32系统上,ebx\ecx\edx\esi和edi按照顺序存放前五个参数。

给用户空间的返回值存放在eax寄存器中。

5.5 系统调用的实现

5.5.2 参数验证

在接受一个用户空间的指针之前,内核必须保证:

内核无论何时都不能轻率的接受来自用户空间的指针!

5.6 系统调用上下文

在进程上下文中,内核可以休眠,也可以被抢占。

【读书笔记】Linux内核设计与实现(第五章)的更多相关文章

  1. Linux内核设计与实现 第五章

    1. 什么是系统调用 系统调用就是用户程序和硬件设备之间的桥梁. 用户程序在需要的时候,通过系统调用来使用硬件设备. 系统调用的存在意义: 1)用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备 ...

  2. linux及安全《Linux内核设计与实现》第一章——20135227黄晓妍

    <linux内核设计与实现>第一章 第一章Linux内核简介: 1.3操作系统和内核简介 操作系统:系统包含了操作系统和所有运行在它之上的应用程序.操作系统是指整个在系统中负责完成最基本功 ...

  3. 2013337朱荟潼 Linux第一章读书笔记——Linux内核简介

    一.Unix历史 二.Linux足迹 类Linux系统.非商业化产品.用途广泛 三.操作系统和Linux内核简介 1.操作系统 (1)是指在整个最基本功能系统中负责完成最基本功能和系统管理的部分. ( ...

  4. Linux内核设计与实现 第十七章

    1. 设备类型 linux中主要由3种类型的设备,分别是: 设备类型 代表设备 特点 访问方式 块设备 硬盘,光盘 随机访问设备中的内容 一般都是把设备挂载为文件系统后再访问 字符设备 键盘,打印机 ...

  5. 《linux内核设计与实现》第一章

    第一章Linux内核简介 一.unix 1.Unix的历史 Unix是现存操作系统中最强大和最优秀的系统. ——1969年由Ken Thompson和Dernis Ritchie的灵感点亮的产物. — ...

  6. Linux内核设计与实现 第三章

    1. 进程和线程 进程和线程是程序运行时状态,是动态变化的,进程和线程的管理操作都是由内核来实现的. Linux中的进程于Windows相比是很轻量级的,而且不严格区分进程和线程,线程不过是一种特殊的 ...

  7. linux及安全《Linux内核设计与实现》第二章——20135227黄晓妍

    第二章:从内核出发 2.1获取源代码 2.1.1使用git Git:内核开发者们用来管理Linux内核源代码的控制系统. 我们使用git来下载和管理Linux源代码. 2.1.2安装内核源代码(如果使 ...

  8. Linux内核设计与实现第五周读书笔记

    第十八章 调试 18.1准备开始 需要的只是: 一个确定的bug.大部分bug通常都不是行为可靠而且定义明确的. 一个藏匿bug的内核版本. 相关的内核代码的知识和运气. 18.2内核中的bug 内核 ...

  9. 【读书笔记】Linux内核设计与实现(第一章&第二章)

    http://pan.baidu.com/s/1hqYAZNQ OneNote做的笔记没法儿带着格式一起导进来.所以上传到百度云,麻烦老师下载一下了. 下次不再用OneNote.

  10. Linux内核设计与实现 第四章

    1. 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上同时运行的各个任务(也就是进程). 这个管理程序就是调度程序,功能: 决定哪些进 ...

随机推荐

  1. 【Nginx】开启 gzip和缓存

    Nginx 开启 gzip和缓存 时间:2016-09-23 16:42:37 nginx 是一个高性能的 Web 服务器,之前也写过一些关于 nginx 的文章.为了提高博客的响应速度,可以从设置 ...

  2. Alpha冲刺报告(5/12)(麻瓜制造者)

    今日已完成 明日计划 部分api示意图 燃尽图 scrum会议照片 今日已完成 邓弘立: 完成部分首页逻辑功能 符天愉: 写代码写着写着想起来昨天的登录接口有个非常zz的逻辑错误,今天修改完后应该没有 ...

  3. css多行省略-webkit-box-orient打包编译后失效原因

    原css代码: .dialog-for-plan .dialog-table .type>p { display: -webkit-box; -webkit-box-orient: vertic ...

  4. ethereumjs/ethereumjs-tx

    https://github.com/ethereumjs/ethereumjs-tx A simple module for creating, manipulating and signing e ...

  5. WorldWind源码剖析系列:星球球体的加载与渲染

    WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()阐明了WorldWind的初始化运行机制(如图1所 ...

  6. 如何快速找到某个研究领域的所有SCI期刊

    https://www.toutiao.com/a6624332265285485060/?tt_from=dingtalk&utm_campaign=client_share&tim ...

  7. OpenCV——积分图计算

    #include <opencv2/opencv.hpp> #include <iostream> #include "math.h" using name ...

  8. 我的$OI$

    我只是懒得写日记啦\(\color{pink}{qwq}\) //11月8日 啊--终于要\(NOIp\)了,为此期盼了好久.紧张了好久的我,不知道会迎来怎样的结果. 我只知道这段回忆是值得保留封存的 ...

  9. 基于Docker一键部署大规模Hadoop集群及设计思路

    一.背景: 随着互联网的发展.互联网用户的增加,互联网中的数据也急剧膨胀.每天产生的数据量数以万计,本地文件系统和单机CPU已无法满足存储和计算要求.Hadoop分布式文件系统(HDFS)是海量数据存 ...

  10. Python基础之公共方法

    公共方法:就是列表,元组,字典,字符串能共同使用的方法: Python内置函数 内置函数罗列 函数 描述 备注 len(item) 计算容器中的元素个数 del(item) 删除变量 del有两种方法 ...