《Linux内核设计与实现》第五章学习笔记

姓名:王玮怡  学号:20135116

一、与内核通信

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

二、API、POSIX、C库

1、API

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

2、POSIX

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

3、C库

C库实现了Unix系统的主要API,包括标准C库函数和系统调用接口。此外,C库提供了POSIX的绝大部分API。

4、POSIX、API、C库以及系统调用间的关系

三、系统调用(syscall)

1、系统调用号

    在Linux中,每个系统调用被赋予一个系统调用号。当用户空间的进程执行一个系统调用时,用系统调用号来指明到底执行哪个系统调用。

*特点:

(1)一旦分配就不能再有任何改变,并且如果一个系统调用被删除,它所占有的系统调用号也不允许被回收利用,内核将系统调用表中已注册过的系统调用号记录存储在sys_call_table中

(2)“未实现”系统调用sys_ni_syscall(),只能返回-ENOSYS,专门针对无效的系统调用而设

2、Linux系统调用快速的原因

(1)Linux上下文切换时间短,进出内核简洁高效

  (2)系统调用处理程序和每个系统调用本身十分简洁

四、系统调用处理程序

    由于内核驻留在受保护的地址空间上,用户空间的程序无法直接执行内核代码,不能直接调用内核空间中的函数。应用程序通知内核的机制是靠软中断实现的:通过引发一个异常来促使系统切换到内核态去执行异常处理程序(系统调用处理程序)

在x86系统上预定义的软中断是中断号128,通过int $0x80指令触发该中断,切换到内核态执行第128号异常处理程序——system_call

1、指定恰当的系统调用

    所有的系统调用陷入内核的方式为:陷入内核空间,并将系统调用号一并传给内核(x86上通过eax寄存器传递)。system_call()函数将系统调用号与NR_syscalls作比较:

(1)系统调用号大于或等于NR_syscalls:return -ENOSYS

  (2)系统调用号小于NR_syscalls:执行相应的系统调用 call *sys_call_table(,%rax,8)  (x86-64位乘8,x86-32位乘4)

2、参数传递

    大部分系统调用除了系统调用号外还需要外部的参数输入,在x86-32系统上,ebx、ecx、edx、esi、edi按顺序存放前五个参数(需要六个及以上的情况不多见)。此外,给用户空间的返回值通过eax寄存器传递。

五、系统调用的实现

1、实现系统调用

(1)决定它的用途;(2)确定新系统调用的参数、返回值和错误码;(3)设计接口

*注意:可移植性和健壮性

2、参数验证

(1)系统调用必须检查每个参数,保证它们不仅合法有效,而且正确。例如,与文件I/O相关的系统调用必须检查文件描述符是否有效;与进程有关的函数必须检查提供的PID是否有效。最重要的一种检查是检查用户提供的指针是否有效。在接收一个用户空间的指针前,内核必须保证:

(2)内核提供了两个方法来完成必须的检查和内核空间与用户空间之间的数据来回拷贝:

*注意:copy_to_user()和copy_from_user()都有可能引起阻塞

(3)调用者可以使用capable()函数检查是否有权能对指定的资源进行操作,如果返回非0值则有权操作,返回0则无权操作

六、调用上下文

  内核在执行系统调用时处于进程上下文。current指针指向当前任务,引发系统调用那个进程。在进程上下文中,内核可以休眠(例如在系统调用阻塞或显式调用schedule()时)并且可以被抢占。

  系统调用返回的时候,控制权仍然在system_call()中,它最终会负责切换到用户空间,并让用户进程继续执行下去。

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

  注册成正式的系统调用的步骤:

(1)在系统调用表的最后加一个表项(从0开始算起)

(2)系统调用号必须定义于<asm/unistd.h>中

(3)系统调用必须被编译进内核映象(不能被编译成模块)

2、从用户空间访问系统调用

  Linux本身提供了一组宏,用于直接对系统调用进行访问:_syscalln(),其中n的范围为0到6,代表需要传递给系统调用的参数个数。对每个宏来说,都有2+2*n个参数,第一个参数对应着系统调用的返回值类型,第二个参数是系统调用名称,再以后是按照系统调用参数的顺序排列的每个参数的类型和名称。

3、采用系统调用作为实现方法的利弊和代替方法

(1)建立一个系统调用的好处:

(2)建立系统调用的弊端:

(3)代替方法:

《Linux内核设计与实现》第五章学习笔记的更多相关文章

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

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

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

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

  3. 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳

    <Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...

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

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

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

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

  6. 《Linux内核设计与实现》Chapter 3 读书笔记

    <Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...

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

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  8. 《Linux内核设计与实现》Chapter 5 读书笔记

    <Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...

  9. 《Linux内核设计与实现》Chapter 18 读书笔记

    <Linux内核设计与实现>Chapter 18 读书笔记 一.准备开始 一个bug 一个藏匿bug的内核版本 知道这个bug最早出现在哪个内核版本中. 相关内核代码的知识和运气 想要成功 ...

随机推荐

  1. IntelliJ IDEA 2017 激活

    http://idea.lanyus.com/ 直接获取注册码 或者复制,在license server中添加: http://intellij.mandroid.cn/ http://idea.im ...

  2. 用智能TFT液晶模块这种串口屏做产品界面设计太简单了,大大的节省了开发时间

    随着科技的发展,TFT液晶显示屏在我们日常中可以随处可见. 工业设备上的显示也逐渐由段式显示.黑白显示转向彩色的TFT液晶显示屏. 普通的TFT液晶显示屏由于开发起来比较麻烦, 需要嵌入式工程时写程序 ...

  3. yii2 支付宝支付教程 [ 2.0 版本 ]

    yii2 支付宝支付教程 [ 2.0 版本 ] 支付宝支付流程个人理解大致就这三步1.前台页面将支付信息数据通过立即支付按钮 ajax提交到订单处理层2.在订单处理层引用支付宝的接口 将支付数据写入 ...

  4. docker swarm英文文档学习-12-在集群模式中的Raft共识

    Raft consensus in swarm mode 在集群模式中的Raft共识 当Docker引擎在集群模式下运行时,manager节点实现Raft 共识算法来管理全局集群状态.Docker s ...

  5. cryptopunks的代码解释

    1.imageHash就是将punk所有图像合在一起的那张图punks.png进行hash得到一个值,并将该值存储到链上,用处就是你可以通过将图像hash然后跟该值对比看图像对不对.这就是它的用处,在 ...

  6. MP实战系列(一)之入门框架搭建和使用

    mybatis plus官网:https://github.com/baomidou/mybatis-plus 上面有对应的实际例子,直接导入即可用. mybatis plus官方的怎么介绍,我就不在 ...

  7. OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out

           OpenGL ES和OpenGL的图标 关于“OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out”这个问题,做一阐述: 1.关键字的小修 ...

  8. Objective-C 类簇深入理解

    类簇(class cluster),是一种基于抽象工厂的设计模式,广泛运用于系统的Foundation框架.顾名思义,即一坨类,这里指的是继承自同一父类的一组私有子类.这种实现既可以简化公共接口,又保 ...

  9. ubuntu 解决TXT文本的乱码的问题。

    windows 系统上编辑的 txt 文本,在ubuntu上出现 乱码,我是这样解决的 1.terminal上输入以下命令: gsettings set org.gnome.gedit.prefere ...

  10. 解决Skyline6.5多球对比时,自动运行TerraExplorer软件的问题

    如果你的操作系统是Win7 64位,在运行Skyline6.5提供的ITE3DWindowEx控件实现多球对比时,启动程序调试运行时,却自动运行了TerraExplorer软件, 这时候你会发现for ...