《Linux内核设计与实现》CHAPTER5阅读梳理
《Linux内核设计与实现》CHAPTER5阅读梳理
【学习时间:2.5hours】
【学习内容:系统调用的概念、功能及实现;系统调用的创建和使用方法】
CHAPTER5 系统调用
1.系统调用的作用
系统调用在用户空间和硬件设备之间提供了一个中间层:
- 为用户空间提供了一个硬件抽象接口;
- 系统调用保证了系统的稳定和安全(防止应用程序不正确地使用硬件设备);
- 实现多任务和虚拟内存
2.系统调用的支持方式
- 系统调用依靠C库支持。用户程序通过包含标准头文件并和C库链接,就可以使用系统调用。
- C库也实现了Unix系统的主要API。此外,C库还提供了POSIX的大部分API。
3.mechanism&policy
- Unix设计中的一大亮点就是区别对待机制和策略。机制指的是“需要提供什么功能”,而策略是指“如何实现这些功能”。
- 比如,程序员就只需要和API打交道,他们不关心机制。而内核只需要和系统调用打交道,只负责提供功能。
4.系统调用的概述
- 系统调用在Linux中称为syscall,返回的值是long型变量;如果出错,C库会将错误代码写入errno全局变量(通过调用perror()函数可以把该变量翻译成用户可以理解的错误代码);
- 为了保证32和64位系统兼容,系统调用在用户空间和内核空间有不同的返回值类型:在用户空间为int,在内核空间为long。
- 如果一个系统调用被删除或者不可用,sysnisyscall()函数将会占用对应的系统调用号负责“填补空缺”,其只返回-ENOSYS。
5.系统调用处理程序
- 用户程序无法直接执行内核代码,它们也不能直接调用内核空间中的代码;
- 通知内核的机制是靠软中断实现的:通过引发一个一场来促使系统切换到内核态去执行处理程序,此时的异常处理程序实际上就是系统调用处理程序——int $0x80所指向的128号异常处理程序就是系统调用处理程序;
- 在陷入内核态之前,用户空间就把相应的系统调用号传给eax;这样系统调用处理程序一旦运行,就可以从eax中得到数据。
6.系统调用实现
- 第一步,明确系统调用的用途;
- 新系统调用的参数、返回值和错误码都应该清晰;借口也要尽量简洁。
- 参数验证
- 验证参数是否合法有效;
- 验证指针是否有效:
- 指向的区域属于用户空间;
- 指向的区域在进程的地址空间中(不允许访问其他进程空间);
- 进程不能绕过内存访问限制。
- 方法:
- 使用内核提供的copytouser()以及copyfromuser()检查从用户空间拷贝或者向其中写入数据是否成功(可能引起阻塞;比如当发生缺页中断的时候);
- 使用capale()函数检查函数是否有权对指定的资源进行操作(如果不能的话则返回0)。
- 绑定系统调用
- 在系统调用表(位于entry.s文件)中加入最后一个表项;
- 将系统调用号定义到<asm/unistd.h>中:#define NR[系统调用] [数值]
- 将系统调用编译进内核映像(而不是模块):将其放入kernel/下的相关文件中(比如sys.c)
系统调用定义形式:
asmlinkage long sys_getpid(void)//以getpid()函数为例
- 【asmlinkage限定词是一个编译指令,通知编译器仅从栈中提取该函数的参数】
Linux本身提供了一组宏,用于直接对系统调用进行访问,即_syscalln();其中n是传递给系统调用的参数个数
- 对每一个宏而言,都有2+2*n个参数:第一个是系统调用返回值类型;第二个是系统调用名称;以后是每个参数的类型和名称
课堂内容补充
1. 所有内核服务都通过系统调用的形式实现。也就是说,系统调用是除了异常和陷入以外内核唯一的合法入口。
2.内核在执行系统调用的时候处于进程上下文,current指针指向引发系统调用的那个进程。
- 在进程上下文中,内核可以休眠——说明系统调用可以使用内核提供的绝大部分功能(然而中断处理程序就不能休眠);
- 并且,在进程上下文中,系统调用是可以重入的,也就是说当前进程可以被抢占
疑问与自查
NR_syscalls是什么意思?
- 我能够大概理解到该变量应该代表了系统调用号。通过后面的阅读,确定它就是代指的系统调用号(网上也有说是当前地址减去系统调用表开始地址的)
asmlinkage限定词的意义?为什么非要从堆栈中取值呢?
- 参考http://www.cnblogs.com/china_blue/archive/2010/01/15/1648523.html
- gcc编译器在汇编过程中调用c语言函数时传递参数有两种方法:一种是通过堆栈,另一种是通过寄存器。缺省时采用寄存器,假如你要在你的汇编过程中调用c语言函数,并且想通过堆栈传递参数,你定义的c函数时要在函数前加上宏asmlinkage。因为当 system call handler 要调用相对应的 system call routine 时,便将一般用途缓存器的值 push 到 stack 里,因此 system call routine 就要由 stack 来读取 system call handler 传递的参数。这就是 asmlinkage 标签的用意。
reboot()系统调用的作用?
《Linux内核设计与实现》CHAPTER5阅读梳理的更多相关文章
- 《linux内核设计与实现》阅读笔记-进程与调度
一.进程 process: executing program code(text section) data section containing global variables open f ...
- 《Linux内核设计与实现》CHAPTER17阅读梳理
<Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...
- 《Linux内核设计与实现》CHAPTER4阅读梳理
<Linux内核设计与实现>CHAPTER4阅读梳理 [学习时间:3hours] [学习内容:多任务:进程调度策略:Linux中进程调度的关键问题:抢占] 个人思考部分见[]标出的部分 一 ...
- 《Linux内核设计与实现》CHAPTER18阅读梳理
<Linux内核设计与实现>CHAPTER18阅读梳理 [学习时间:2hours] [学习内容:bug的来源分析:bug调试途径] 一.bug来源 1.内核中的bug 内核中的bug表现得 ...
- 《Linux内核设计与实现》CHAPTER1,2阅读梳理
<Linux内核设计与实现>CHAPTER1,2阅读梳理 [学习时间:2.5hours] [学习内容:Linux内核简介——历史与现今版本:Linux内核源代码以及编译] CHAPTER1 ...
- 《Linux内核设计与实现》CHAPTER13阅读梳理
<Linux内核设计与实现>第13章阅读总结 [edited by 5216lwr] 一.虚拟文件系统概述 1.虚拟文件系统 (也称作虚拟文件交换或VF)作为内核子系统,为用户空间程序提供 ...
- linux内核设计与实现一书阅读整理 之第三章
chapter 3 进程管理 3.1 进程 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 内核调度的对象是线程而并非进程. 在现代操作系统中,进程提供两种虚拟机制: 虚拟处理器 ...
- linux内核设计与实现一书阅读整理 之第十八章
CHAPTER 18 调试 18.1 准备开始 需要的是准备是: - 一个bug - 一个藏匿bug的内核版本 - 相关内核代码的知识和运气 重点: 想要成功的进行调试,就取决于是否能让这些错误重现. ...
- linux内核设计与实现一书阅读整理 之第五章
CHAPTER 5 系统调用 5.1 与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个: 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进 ...
随机推荐
- Shell 编程基础之 Case 练习
一.语法 case $变量 in "第一个变量内容") # 每个变量内容建议用双引号括起来,关键字则为小括号 ) # 执行内容 ;; # 每个类别结尾使用两个连续的分号来处理! & ...
- (转)Ubuntu samba配置服务文件包
转:http://os.51cto.com/art/201001/176366.htm Ubuntu samba服务配置是很不错的文件应用很有学习价值,这里我主要讲解Ubuntu samba服务配置的 ...
- Mybatis Generator insert useGeneratedKeys keyProperty
Mybatis自动生成代码,需要用到mybatis Generator,详见http://mybatis.github.io/generator/configreference/generatedKe ...
- Android 摇一摇 之 传感器片
要监视原始的传感器数据,你需要实现两个通过SensorEventListener接口暴露的回调方法:onAccuracyChanged()和onSensorChanged(). 传感器数据的速度值,这 ...
- 如何在电脑上测试手机网站(补充)和phonegap
颜海镜 介绍了专业人士精准测试手机网站的经验 http://www.cnblogs.com/yanhaijing/p/3557261.html, 因为太专业了,稍显复杂和琐碎,这里我介绍下我一直关注的 ...
- CSS:z-index层级在IE中无效
引用地址:http://apps.hi.baidu.com/share/detail/19853262 在CSS中,只能通过代码改变层级,这个属性就是z-index,要让z-index起作用有个小小前 ...
- 【BZOJ2186】【SDoi2008】沙拉公主的困惑 数论
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...
- Android -- ids.xml文件的使用
1.当我们在使用控件的时候,有的时候不可避免的要为控件声明id ,而分散在各个xml文件中,有时候查找起来又不是特别的方便 ,因此,安卓为我们提供了ids.xml 文件,保存在res -->va ...
- SQLServer大数据优化方法若干
1.使用ndf文件. 自从sqlserver2005后,默认不增生成ndf文件. mdf:priMary Data file ldf:Log Data File ndf:secoNdary data ...
- Nodejs正则表达式函数之match、test、exec、search、split、replace使用详解
1. Match函数 使用指定的正则表达式函数对字符串惊醒查找,并以数组形式返回符合要求的字符串 原型:stringObj.match(regExp) 参数: stringObj 必选项,需要去进行匹 ...