《Linux内核设计与实现》读书笔记 5
第五章系统调用
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,代表需要传递给系统调用的参数个数。
《Linux内核设计与实现》读书笔记 5的更多相关文章
- Linux内核设计与实现 读书笔记 转
Linux内核设计与实现 读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...
- Linux内核设计与实现 读书笔记
第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...
- Linux内核设计与实现读书笔记(8)-内核同步方法【转】
转自:http://blog.chinaunix.net/uid-10469829-id-2953001.html 1.原子操作可以保证指令以原子的方式执行——执行过程不被打断.内核提供了两组原子操作 ...
- Linux内核设计与实现——读书笔记2:进程管理
1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3 ...
- Linux内核设计与实现——读书笔记1:内核简介
内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...
- 初探内核之《Linux内核设计与实现》笔记上
内核简介 本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核 原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...
- Linux内核架构与底层--读书笔记
linux中管道符"|"的作用 命令格式:命令A|命令B,即命令1的正确输出作为命令B的操作对象(下图应用别人的图片) 1. 例如: ps aux | grep "tes ...
- Linux内核设计第十七章笔记
第十七章 设备与模块 关于设备驱动和设备管理,四种内核成分 设备类型:在所有unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标代码的机制 内核对象:内核数据 ...
- Linux内核分析 一二章读书笔记
第一章 Linux内核简介 1.Unix (1)Unix系统很简洁 (2)在Unix中,所以东西都被当作文件对待,通过一套相同的系统调用接口来进行:open(),read(),write(),lsee ...
- 《Linux内核设计与实现》笔记-1-linux内核简单介绍
一.Linux内核相对于传统的UNIX内核的比較: (1):Linux支持动态内核模块. 虽然Linux内核也是总体式结构,但是同意在须要的时候动态哦卸除(rmmod xxx)和载入内核模块(insm ...
随机推荐
- C++基础算法学习——N皇后问题
n皇后问题:输入整数n, 要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案. 代码如下: #include <iostream> #include<cmath& ...
- http://blog.csdn.net/pipisorry/article/details/51471222
这个博主很有意思 机器学习之用Python从零实现贝叶斯分类器 参数估计:贝叶斯思想和贝叶斯参数估计
- (转)web.xml中的contextConfigLocation在spring中的作用
(转)web.xml中的contextConfigLocation在spring中的作用 一.Spring如何使用多个xml配置文件 1.在web.xml中定义contextConfigLocat ...
- MATLAB——LMS算法(△规则Delta Rule)
- 深入浅出的webpack构建工具---DevServer配置项(二)
深入浅出的webpack构建工具---DevServer配置项(二) 阅读目录 DevServer配置项 1. contentBase 2. port 3. host 4. headers 5. hi ...
- linux内存管理源码分析 - 页框分配器
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 最近在学习内核模块的框架,这里做个总结,知识太多了. 分段和分页 先看一幅图 也就是我们实际中编码时遇到的内存地 ...
- tiled卷积神经网络(tiled CNN)
这个结构是10年Quoc V.Le等人提出的,这里的tiled,按照 Lecun的解释是Locally-connect non shared.即是局部连接,而且不是共享的,这是针对于权重来说的.本文翻 ...
- 走近SpringBoot
(博客园不支持MarkDown编辑,看完整版请移步:https://www.zybuluo.com/Allen-llh/note/1199946) 1. (Building a RESTful Web ...
- Vue-父子组件传值
在 Vue 中,父子组件的关系可以总结为 prop 向下传递,事件向上传递.一.父组件向子组件传值 使用 Prop 传递数据,父组件的数据需要通过 prop 才能下发到子组件中,子组件要显式地用 pr ...
- Luogu P2312 解方程
据大佬的说法这种大力乱搞题出在除NOIp以外的任何比赛都是很好的然而就是被出在了NOIp 首先对于想直接上高精的同学,我还是祝你好运吧. 我们考虑一个十分显然的性质,若\(a=b\),则对于任一自然数 ...