《Linux内核设计与实现》读书笔记 第五章 系统调用
第五章系统调用
系统调用是用户进程与内核进行交互的接口。为了保护系统稳定可靠,避免应用程序恣意忘形。
5.1与内核通信
系统调用在用户空间进程和硬件设备间添加了一个中间层,
作用:为用户空间提供了一种硬件的抽象接口;保证了系统的稳定和安全,避免应用程序不正确使用硬件,窃取其他进程的资源,或做出危害系统的行为;为了实现多任务和虚拟内存。
Linux提供的系统调用比大部分操作系统少得多。
5.2 API、POSIX、和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内核设计与实现》读书笔记 第五章 系统调用的更多相关文章
- Linux内核设计与实现 读书笔记 转
Linux内核设计与实现 读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
- Linux内核设计与实现 读书笔记
第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...
- 《linux内核设计与实现》读书笔记第五章——系统调用
第5章 系统调用 操作系统提供接口主要是为了保证系统稳定可靠,避免应用程序恣意妄行. 5.1 与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层. 该层主要作用有三个: 为用户空间提供了 ...
- Linux内核设计与实现 总结笔记(第二章)
一.Linux内核中的一些基本概念 内核空间:内核可独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限.这种系统态和被保护起来的内存空间,称为内核空间. 进程上下文:当 ...
- Linux内核设计与实现读书笔记(8)-内核同步方法【转】
转自:http://blog.chinaunix.net/uid-10469829-id-2953001.html 1.原子操作可以保证指令以原子的方式执行——执行过程不被打断.内核提供了两组原子操作 ...
- Linux内核设计与实现——读书笔记2:进程管理
1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3 ...
- Linux内核设计与实现——读书笔记1:内核简介
内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...
- Linux内核设计与实现 总结笔记(第九章)内核同步介绍
在使用共享内存的应用程序中,程序员必须特别留意保护共享资源,防止共享资源并发访问. 一.临界区和竞争条件 1.1 临界区和竞争条件 所谓临界区就是访问和操作共享数据代码段.多个执行线程并发访问同一个资 ...
随机推荐
- redis中的key设置过期时间
EXPIRE key seconds 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除. 在 Redis 中,带有生存时间的 key 被称为『易失的 ...
- 1·3 对 git 的认识
我可以诚实的说:这是我第一次听见这个名词 GIT.老师您发的关于git链接我下载了,只是还没看完.所以以下只是片面的理解,在后期我会单独再发一次. 一·GIT的简单介绍 1·Git是一款免费.开源的分 ...
- 1.1ASP.NET Web API 2入门
HTTP 不只是为了生成 web 页面.它也是建立公开服务和数据的 Api 的强大平台.HTTP 是简单的. 灵活的和无处不在.你能想到的几乎任何平台有 HTTP 库,因此,HTTP 服务可以达到范围 ...
- DOM对象
DOM是以层次结构组织的节点或信息片断的集合.文档对象模型(Document Object Model)是给HTML与XML文件使用的一组API.DOM的本质是建立网页与脚本语言或程序语言沟通的桥梁. ...
- IIS相关知识
1.在web.config中,iis6使用<system.web>下配置项,iis7使用<system.webServer>下配置项 2.<httpHandlers> ...
- NSString相关操作
//创建一个字符串对象 NSString * str_1 = @"Hello"; //字面量方法 ; NSString * str_2 = [NSString stringWith ...
- python备忘
1.引用已经编写好的.py文件(Windows系统) >>>import sys >>>sys.path.append("C:/python") ...
- sqlserver表分区小结
为什么要表分区? 当一个表的数据量太大的时候,我们最想做的一件事是什么?将这个表一分为二或者更多分,但是表还是这个表,只是将其内容存储分开,这样读取就快了N倍了 原理:表数据是无法放在文件中的,但是 ...
- RISC指令集的五个周期
RISC指令集的五个周期 RISC(reduced instruction set computer,精简指令集计算机)简称为精简指令集.RISC把执行指令的精力主要放在了经常使用的指令上面.本文主要 ...
- JavaOO面向对象中的注意点
1.JavaOO宗旨思想: ★万物皆对象,对象因关注而产生★ ☆类是对象的抽取,对象是类的实例☆ 2.JavaOO的三大特征: 封装.继承.多态 (第四大特征 抽象 现还有争议) 3.属性与行为: ...