《Linux内核设计与实现》读书笔记 第五章 系统调用

 

第五章系统调用

系统调用是用户进程与内核进行交互的接口。为了保护系统稳定可靠,避免应用程序恣意忘形。

51与内核通信

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

作用:为用户空间提供了一种硬件的抽象接口;保证了系统的稳定和安全,避免应用程序不正确使用硬件,窃取其他进程的资源,或做出危害系统的行为;为了实现多任务和虚拟内存。

Linux提供的系统调用比大部分操作系统少得多。

5.2 APIPOSIX、和C

一个API定义了一组应用程序使用的编程接口。(API和系统调用不是一一对应)API可以在各种不同的操作系统上实现,给应用程序提供完全相同的接口,而API本身的实现在不同系统中可能迥异。

Unix的API基于POSIX,Linux尽力与POSIX和SUSv3兼容

Linux的系统调用作为C库的一部分提供。

5.3系统调用

访问系统调用通常通过C库中定义的函数调用,通常需要定义参数,而且可能产生副作用(使系统状态发生改变)。系统调用还会返回了一long类型的值表示成功或错误。

定义系统调用:asmlinkage long     sys_***

限定词  返回类型 命名规则

系统调用号:每个系统调用被赋予一个系统调用号,用户空间执行系统调用时,用系统调用号指明系统调用。一旦分配不再变更,系统调用被删除,其系统调用号也不允许回收利用。内核记录了系统调用表中所有已注册的系统调用列表,存储在sys_call_table中

系统调用的性能:Linux系统调用比其他操作系统要快,原因:上下文切换时间短;系统调用程序和系统调用都很简洁。

5.4系统调用处理程序

内核驻留在受保护的地址空间上,因此应用程序要通知内核自己需要使用系统调用。通知内核是靠软中断实现引发异常时系统切换到内核态。通过int $0x80触发中断,执行128号异常处理程序(系统调用处理程序)

指定恰当的系统调用:X86上系统调用号通过eax寄存器传递给内核

参数传递:除了系统调用号还需要传递外部参数,按顺序存储在ebx,ecx,edx,esi和edi五个寄存器中,很少有需要六个参数的。

5.5系统调用的实现

实现系统调用:1、决定用途(不提倡采用多用途);2、调用的参数、返回值和错误码应该是什么(借口力求简洁,参数尽可能少,力求稳定);3、设计接口尽量为将来做考虑(是否有不必要的限制,是否可移植);

提供机制(mechaniam)不提供策略(policy)

参数验证:必须仔细检查参数是否合法有效,因为系统调用在内核空间执行,如果有不合法输入,那会威胁系统安全和稳定。最重要的检查是 检查用户提供的指针是否有效。在接收一个用户空间的指针之前,内核必须保证1、指针指向的内存区域属于用户空间。进程绝不能哄骗内核去读内核空间的数据;2、指针指向的内存区域在进程的地址空间里。进程绝不能哄骗内核去读其他进程的数据;3、进程绝不能绕过内存访问限制。

内核提供copy_to_user(),copy_from_user()两个方法完成检查拷贝数据

 

5.6系统调用上下文

内核在执行系统调用的时候处于进程上下文,在进程上下文中,内核可以休眠,并且可以被抢占。休眠说明系统调用可以使用内核提供的绝大部分功能。可以抢占说明新进程可以使用相同的系统调用。

绑定一个 系统调用的最后步骤:1、在系统调用表的最后加入一个表项;2、系统调用号必须定义于<asm/unistd.h>;3、系统调用必须被编译进内核映像。

从用户空间访问系统调用:只写出系统调用gilc恐怕并不提供支持。Linux本身提供一组宏_syscalln(),n的范围从0到6,代表需要传递给系统调用的参数个数。

新建一个系统调用的好处:1、系统调用容易创建且使用方便;2、系统调用很高效。

新建一个系统调用的坏处:1、需要系统调用号,这需要一个内核在处于开发版本的时;候官方分配给你;2、系统调用的接口不允许改动;3、需要将系统调用分别注册到每个需要支持的体系结构中;4、在脚本中不容易调用系统调用,也不能从文件系统直接访问系统调用;5、对于简单信息交换,系统调用大材小用;

linux第二次读书笔记的更多相关文章

  1. 20135320赵瀚青LINUX第二章读书笔记

    第二章-从内核出发 获取内核代码 使用git 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tor ...

  2. Linux第二章读书笔记

    1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...

  3. 2013337朱荟潼 Linux第二章读书笔记——从内核出发

    1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...

  4. 《深入理解Linux内核》 读书笔记

    深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样. ...

  5. Linux第二次学习笔记

    #Linux第二次实验(第三周) 学习目标 熟悉Linux系统下的开发环境 熟悉vi的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 熟练使用gdb调试技术 熟悉makefile ...

  6. Linux内核分析 读书笔记 (第一章、第二章)

    第一章 Linux内核简介 1.1 Unix的历史 Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的. 在Unix中,所有东西都被当做文件,这种抽象使对数据和对设备的操作是通过一套相 ...

  7. 《鸟哥的Linux私房菜:基础学习篇》第二部分读书笔记

    一.Linux的文件权限与目录配置 1. Linux用户身份与用户组记录的文件:默认情况下,/etc/passwd记录所有的系统账号与一般身份账号及root的相关信息,/etc/shadow记录个人的 ...

  8. linux私房菜-读书笔记

    第零章:计算机概论 计算机:接受用户输入指令和数据,经过中央处理器的数据和逻辑单元运算处理器处理后,以产生或存储成有用的信息. 计算机硬件的五大单元:输入单元.输出单元.CPU内部控制单元.算术逻辑单 ...

  9. 《Linux程序设计》--读书笔记---第十三章进程间通信:管道

    管道:进程可以通过它交换更有用的数据. 我们通常是把一个进程的输出通过管道连接到另一个进程的输入: 对shell命令来说,命令的连接是通过管道字符来完成的: cmd1    |     cmd2 sh ...

随机推荐

  1. January 18th, 2018 Week 03rd Thursday

    To strive, to seek, to find, and not to yield. 去奋斗,去寻觅,去探索,但绝不屈服. Strive for our dreams, seek the ve ...

  2. 【微信JSSDK】PHP版微信录音文件下载

    微信的录音文件上传到微信服务器上,只能保存三天. 因此需要做一个转存到自己服务器,或者七牛云的操作. 转存到自己服务器 调用微信JSSDK API 录音, 录音结束,上传到微信服务器,获取录音文件的 ...

  3. python2.7.15 + PyQt4部署

    安装python模块首先想到的就是 https://pypi.org/,但在上面下载的PyQt4的包却找不到安装的方法,于是找找试其它方法,下面介绍通过pip安装whl的安装方式 1.先打开 http ...

  4. 【洛谷】【搜索(dfs)】P3956 棋盘

    题目传送门:戳 题目描述: 有一个 \(m * m\) 的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色 ...

  5. Ignatius and the Princess III(方案背包+搜索)

    就是问你,n这个数可以被多少种方案组成. 比如: 算是,方案+完全背包的模板题了. #include<iostream> #include<cstring> using nam ...

  6. Git基础命令的使用——详细教程2

    Git安装默认完成后,在左面点击鼠标右键,鼠标右键菜单中会多出来两个选项: a)  Git GUI Here <—>  图型界面模式 b) Git Bash Here <—> ...

  7. go标准库的学习-encoding/base64

    参考:https://studygolang.com/pkgdoc 导入方式: import "encoding/base64" base64实现了RFC 4648规定的base6 ...

  8. https://leetcode.com/problems/palindromic-substrings/description/

    https://www.cnblogs.com/grandyang/p/7404777.html 博客中写的<=2,实际上<=1也是可以的 相当于判断一个大指针内所有子字符串是否可能为回文 ...

  9. 【Codeforces 86C】Genetic engineering

    Codeforces 86 C 题意:给\(m\)个串,要构造长度为\(n\)的串,而且必须由这些模式串们覆盖(可以重复),问可以构造多少种. 思路:首先构造AC自动机,然后\(dp(i,j,k)\) ...

  10. Oracle 把查询的多个字段赋值给多个变量

    select f1,f2,f3 into v1,v2,v3 from tab1