第5章系统调用

5.1与内核通信

主要作用:

  • 为用户控件提供了一种硬件的抽象接口。
  • 保证了系统稳定性与安全性。
  • 为用户空间&系统提供公共接口。

5.2API、POSIX和C库

一般情况,应用程序通过在用户空间实现的应用编程接口API而不是直接通过系统调用来编程。(因为应用程序使用的这种编程接口实际上不需要和内核提供的系统调用对应)

总之,Unix系统调用提供机制而不提供策略。换句话说,Unix的系统调用抽象出了用于完成某种确定的目标的函数。

5.3系统调用

  • asmlinkage(限定词):编译指令,通知编译器仅从栈中提取该函数的参数。
  • sys_xxxx():系统调用的函数名前加上sys_,都应遵守的命名规则。

5.3.1系统调用号

一旦分配就不能再有任何变更,否则编译好的应用程序就会崩溃。此外,如果一个系统调用被删除,它所占用的系统调用号也不允许备被回收利用。

内核记录了系统调用表中的所有已注册过的系统调用列表,存储在sys_call_table中。

5.3.2系统调用的性能

原因:进程上下文切换快;系统调用处理程序&系统调用简洁

5.4系统调用处理程序

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

通知内核的机制是靠软中断实现的:通过引发一个异常来促使系统切换到内核态来执行异常处理程序。此时的异常处理程序实际上就是系统调用处理程序。(int$0x80)

5.4.1指定恰当的系统调用

在陷入内核之前,用户空间就把相应系统调用所对应的号放入eax中。

5.4.2参数传递

参数用寄存器传递。

5.5系统调用实现

Linux系统调用实现时并不徐璈太关心它与系统调用处理程序之间的关系,难在设计和实现。

5.5.1实现系统调用

  • 决定它的用途,每个为系统调用都应该有一个明确的用途。
  • 新系统调用的参数、返回值和错误码又该是什么呢?接口应该力求简洁,参数尽可能少。
  • 系统调用设计得越通用越好。

5.5.2参数验证

系统调用必须仔细检查它们所有的参数是否合法有效。

1检查用户提供的指针是否有效

  • 指针指向的内存区域属于用户空间。
  • 指针指向的内存区域在进程的地址空间里。
  • 如果是读,则内存应被标记为可读。进程决不能绕过内存访问限制。

2检查针对是否有合法权限

5.6系统调用上下文

  • 内核在执行系统调用时处于进程上下文。current指针指向当前任务,即引发系统调用的那个进程。
  • 在进程上下文中,内核可以休眠并且可以被抢占。
  • 当系统调用返回的时候,控制权仍在system_call()中,它负责切换到用户空间,并让用户进程继续执行下去。

5.6.1绑定一个系统调用的最后步骤

当编写完一个系统调用后,把它注册成一个正式的系统调用:

  • 在系统调用表的最后中加入一个表项。
  • 对于所支持的各种体系结构,系统调用号都必须定义于<asm/unistd.h>中。
  • 系统调用必须被编译进内核映象(不能被编译成模块)。
  • 最后,用户空间就可以调用系统调用函数了。

5.6.2从用户空间访问调用

  • 通常系统调用靠C库支持。
  • Linux本身提供了一组宏,用于直接对系统调用进行访问。

5.6.3为什么不通过系统调用的方式实现

建立一个新的系统调用非常容易,但却绝不提倡这么做。

Linux内核设计与实现第四周读书笔记的更多相关文章

  1. 《Linux内核设计与实现》 Chapter4 读书笔记

    <Linux内核设计与实现> Chapter4 读书笔记 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子 ...

  2. 《Linux内核分析》第六周 读书笔记

    <Linux内核设计与实现>CHAPTER3阅读梳理 [学习时间:3hours] [学习内容:进程的描述:进程的生命周期(包括创建.终结)] 一.进程(任务)描述 1.进程是处于执行期的程 ...

  3. linux内核分析 1、2章读书笔记

    一.linux历史 20世纪60年代,MIT开发分时操作系统(Compatible TIme-Sharing System),支持30台终端访问主机: 1965年,Bell实验室.MIT.GE(通用电 ...

  4. 《Linux内核分析》第七周 读书笔记

    <深入理解计算机系统>CHAPTER7阅读梳理 [学习时间:3hours] [学习内容:链接需要的代码&数据:链接机制:链接生成的目标文件] 一.链接概述 1.链接 定义:链接是将 ...

  5. 《Linux内核设计》第17章学习笔记

  6. 《linux内核》课本第五章读书笔记

  7. 《Linux内核设计与实现》课本第一章&第二章学习笔记

    <Linux内核设计与实现>课本学习笔记 By20135203齐岳 一.Linux内核简介 Unix内核的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件 ...

  8. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  9. 《Linux内核设计与实现》读书笔记 - 目录 (完结)

    读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: < ...

随机推荐

  1. PHP自定义生成二维码跳转地址

      比较简单的一款PHP自定义生成二维码跳转地址,手机端微信扫码,自动跳转到定义好的链接.支持自定义生成二维码尺寸.间距等.    鼠标悬浮显示二维码弹出层,离开后消失.js实现,代码如下: $(fu ...

  2. mysql 无法启动,错误1067,进程意外终止

    在做项目启动mysql数据库时,经常出现 这个错误,今天总结一下 //查看了网上很多的方法,都不适用,但或许对你适用.ps:网上只提供了怎么解决这个问题,但是没有将怎么去发现问题,对症下药才是王道.而 ...

  3. 我想这次我真的理解了 JavaScript 的单线程机制

    今天面试的时候被问到一个问题,是关于 JS 异步的.当时我脑海中闪过了一个单线程的概念,但却没有把真正的原理阐述清楚.所以回来特意重新回顾了前面单线程和异步相关的一些知识点. 虽然之前学习的时候也接触 ...

  4. IncDec序列:差分+贪心

    IncDec序列 题目描述: 给定一个长度为 n 的数列 a1,a2,…,an,每次可以选择一个区间[l,r],使下标在这个区间内的数都加一或者都减一. 求至少需要多少次操作才能使数列中的所有数都一样 ...

  5. Hyperledger Fabric中的Identity

    Hyperledger Fabric中的Identity 什么是Identity 区块链网络中存在如下的角色:peers, orderers, client application, administ ...

  6. ES6的新特性(8)——数组的扩展

    数组的扩展 扩展运算符 含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) / ...

  7. Js 问题分析--js 影响页面性能

    文档下载链接:http://pan.baidu.com/s/1i4Hci4d (失效请留言)

  8. PSP DAILY的NABCD分析

    1) N (Need 需求) PSP Daily 解决了用户(软件工程课上学生)记录例行报告.写每周PSP表格和统计的需求.潜在用户还有未来该课堂的学生和需要用PSP方法记录任务完成时间和统计的学习者 ...

  9. 大学网站UI设计分析(以学校领导/历届领导为例)

    第一次的冲刺阶段让我过了一把PM的瘾,第一阶段的冲刺完成以后第一感觉就是PM不好当,在大学里做个课程设计当个PM相对而言还是比较容易的,但是我明白,当我们走向工作岗位以后,面临的情况会比学校的情况的复 ...

  10. 第一个scrum会议

    第一阶段冲刺任务认领: PM薛哥: 让手电筒亮起来 梁哥: 代码测试 康哥: 用户反馈等等