linux读书笔记(5章)
linux读书笔记(5章)
标签(空格分隔): 20135328陈都
第五章 系统调用
5.1 与内核通信
- 系统调用
- 让应用程序受限的访问硬件设备
- 提供创建新进程并与已有进程通信的机制
- 提供申请操作系统其他资源能力
系统调用在用户空间进程和硬件设备之间添加了一个中间层。该层主要作用有三个。
- 首先,它为用户空间提供了一种硬件的抽象接口。举例来说,当需要读写文件的时候,应用程序就可以不去管磁盘类型和介质,甚至不用去管文件所在的文件系统到底是哪种类型。
- 第二,系统调用保证了系统的稳定和安全。作为硬件设备和应用程序之间的中间人,内核可以基于权限、用户类型和其他一些规则对需要进行的访问进行裁决。举例来说,这样可以避免应用程序不正确地使用硬件设备,窃取其他进程的资源,或做出其他危害系统的事情。
- 第三,每个进程都运行在虚拟系统中,而在用户空间和系统的其余部分提供这样一层公共接口,也是出于这种考虑。
5.2 API, POSIX 和C 库
- 一般情况下,应用程序通过在用户空间实现的应用编程接口(api)而不是直接通过系统调用来编程。
- 这点很重要,因为应用程序使用的这种编程接口实际上并不需要和内核提供的系统调用对应。
- 一个API 定义了一组应用程序使用的编程接口。
5.3 系统调用
要访问系统调用〈在Linux中常称作syscall),通常通过C库中定义的函数调用来进行。
5.3.1 系统调用号
- 在Linux 中,每个系统调用被赋予一个系统调用号。这样,通过这个独一无二的号就可以关联系统调用。当用户空间的进程执行一个系统调用的时候, 这个系统调用号就用来指明到底是要执行哪个系统调用:进程不会提及系统调用的名称。
- 内核记录了系统调用表中的所有已注册过的系统调用的列表,存储在sys_call_ table 中。每一种体系结构中,都明确定义了这个表,在x86-64中,它定义arch/i386/kemel/syscall_64.c文件中。这个表为每一个有放的系统调用指定了唯一的系统调用号。
5.3.2 系统调用的性能
Linux 系统调用比其他许多操作系统执行得要快。同时系统调用处理程序和每个系统调用本身也都非常简洁。
5.4 系统调用处理程序
用户空间的程序无摇直接执行内核代码。它们不能直接调用内核空间中的函数,因为内核驻留在受保护的地址空间上。
5.4.2 参撒传递
除了系统调用号以外,大部分系统调用都还需要一些外部的参数输入。所以,在发生陆入的时候,应该把这些参数从用户空间传给内核。最简单的办撞就是像传递系统调用号一样,把这些参数也存放在寄存器里。在x86-32 系统上, ebx, ecx、edx、esi和edi按照顺序存放前五个参数。需要六个或六个以上参数的情况不多见,此时,应该用一个单拙的寄存器存放指向所有这些参数在用户空间地址的指针。

5.5 系统调用的实现
实际上,一个Linux的系统调用在实现时并不需要太关心它和系统调用处理程序之间的关系。
记住Unix 的格言:“提供机制而不是策略”。
当你写一个系统调用的时候,要时刻注意可移植性和健壮性,不但要考虑当前,还要为将来做打算。基本的Unix系统调用经受住了时间的考验:它们中的很大一部分到现在都还和30 年前一样适用和有效。
为什么不提倡用系统调用实现
建立一个新的系统调用的好处:
- 系统调用创建容易且使用方便。
- Linux 系统调用的高性能显而易见。
问题是: - 你需要一个系统调用号,而这需要一个内核在处于开发版本的时候由官方分配给你。
- 系统调用被加入稳定内核后就被固化了,为了避免应用程序的崩棚,它的接口不允许傲改动。
- 需要将系统调用分别注册到每个需要支持的体系结构中去。
- 在脚本中不容易调用系统调用,也不能从文件系统直接访问系统调用。
- 由于你需要系统调用号,因此在主内核树之外是很难维护和使用系统调用的。
- 如果仅仅进行简单的信息交换,系统调用就大材小用了。
替代方法 - 某些接口可以用文件描述符表示
- 把增加的信息作为文件放在sysfs的合适位置
总结
对于Unix的格言,我在网上查了很多,觉得大家讲的都很有道理,把所学用在生活中也是不错的。
区别对待机制(mechanism)和策略(policy)是Unix设计中的一大亮点。大部分的编程问题都可以被切割成两个部分:“需要提供什么功能”(机制)和“怎样实现这些功能”(策略)。如果由程序中的独立部分分别负责机制和策略的实现,那么开发软件就更容易,也更容易适应不同的需求。
如果说机制是一种框架,那么,策略就是填充框架的一个个具体实体。机制提供的是一种开放而宽松的环境,而策略就是在这个环境下赖以生存的生命个体。比如,我们编写的一个程序,fork()以后,就成为一个个进程的生命个体。而操作系统所提供给我们创建、执行以及结束进程的各种原语-fork(),exex()和exit()等是统管各种进程的机制。我们所创建进程的死活并不会影响机制本身。
参考资料:《Linux内核设计与实现》(原书第三版)
linux读书笔记(5章)的更多相关文章
- # linux读书笔记(3章)
linux读书笔记(3章) 标签(空格分隔): 20135328陈都 第三章 进程管理 3.1 进程 进程就是处于执行期的程序(目标码存放在某种存储介质上).但进程并不仅仅局限于一段可执行程序代码( ...
- 跟着鸟哥学Linux系列笔记3-第11章BASH学习
跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...
- STL源码分析读书笔记--第二章--空间配置器(allocator)
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...
- 《C++ Primer》读书笔记 第一章
读<C++ Primer>才知道,自己对C++知之甚少... 写个博客记录下自己C++的成长,只是读书笔记,不是对<C++ Primer>知识点的总结,而是对自己在书上看到的以 ...
- 跟着鸟哥学Linux系列笔记2-第10章VIM学习
跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 常用的文本编辑器:Emacs, pico, nano, joe, vim VI ...
- 《疯狂Java:突破程序员基本功的16课》读书笔记-第一章 数组与内存控制
很早以前就听过李刚老师的疯狂java系列很不错,所以最近找一本拿来拜读,再此做下读书笔记,促进更好的消化. 使用Java数组之前必须先对数组对象进行初始化.当数组的所有元素都被分配了合适的内存空间,并 ...
- 《Linux内核设计与实现》读书笔记 第二章 从内核出发
一.获取内核源码 1. Git git实际上是一种开源的分布式版本控制工具. Linux作为一个开源的内核,其源代码也可以用git下载和管理 - 获取最新提交到版本树的一个副本 - $ git clo ...
- Linux读书笔记第三、四章
第三章 主要内容: 进程和线程 进程的生命周期 进程的创建 进程的终止 1. 进程和线程 进程和线程是程序运行时状态,是动态变化的,进程和线程的管理操作(比如,创建,销毁等)都是有内核来实现的. Li ...
- Linux读书笔记第一、二章
第一章 Linux内核简介 1.1Unix历史 Unix特点:1.很简洁 2.所有东西都被当成文件对待 3.Unix内核和相关的系统工具软件都是用C语言编写而成 4.进程创建非常迅速 1.2追寻 ...
随机推荐
- 1.js基础(以通俗易懂的语言解释JavaScript)
1.JavaScript组成: ECMAScript: 解释器.翻译 -->几乎没有兼容问题 DOM: Document Object Model -->有一些操作不兼容 BOM: Bro ...
- es6安装babel包
1.前面下载node.js及安装淘宝镜像可以查看我写的vue.js环境搭建 2.安装完node后,安装babel npm install -g babel-cli 3.检验babel是否安装成功: b ...
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...
- php可逆加密解密
函数: function encrypt($data, $key) { $prep_code = serialize($data); $block = mcrypt_get_block_size('d ...
- linux 的常用命令---------第十阶段
虚拟机三种网络模式 相同模式下的各个虚拟机之间都可以通信----两台虚拟机若都是 nat模式 或 桥接模式 或 仅主机模式,则这两台虚拟机之间是可以通信的. 桥接模式: (配置桥接模式的虚拟机可作为独 ...
- svn 更新提交文件冲突
文件冲突定义:svn up更新服务器文档到本地的时候发现本地的文件有所改动,和svn服务器不同步 服务器会报冲突,让你觉得已谁的为准,根据实际情况我们需要选择是以服务器还是以本地代码为准 报错: Co ...
- Jmeter上传下载文件
每次使用时都会忘记,此处是存储网路上通用的方式. 1.上传文件 记得勾选“use multipart/form-data for post”,表明此请求包含文件信息.在信息请求头中,需加入“Con ...
- day29
今日内容: 异常处理 元类介绍 元类(通过元类中的__init__方法,改变实例化获得的类) 元类(通过元类中的__call__方法,改变实例化获得的类实例化出来的对象) 1.异常处理: 什么是异常处 ...
- PuTTY+Xming实现X11的ssh转发
1 需求分析 有些Linux程序还是不能完全离开窗口环境,或者说离开后操作不方便.其中Oracle就是这样一个程序,其工具程序大多数能够在纯命令行静默执行,如 OCI,DBCA,NetCA等,但是工作 ...
- input:file onchange事件无法读取解决方法
最近做项目,移动端的多文件上传,使用input:file读取文件 <input type='file' name='file' multiple accept='image/*' capture ...