《LINUX内核设计与实现》第五章学习总结
一、与内核通信
系统调用:用户控件进程和硬件设备之间添加了一个中间层
系统调用的三个主要作用:
- 为用户空间提供了一种硬件的抽象接口
- 系统调用保证了系统的稳定和安全
- 每个进程都运行在虚拟系统中,而在用户控件和系统的其余部分提供这样一层公共接口
注意:在Linux中,系统调用是用户控件访问内核的唯一手段;除异常和陷入外,他们是内核唯一的合法入口。
二、API、POSIX和C库
POSIX-Unix世界中最流行的应用编程接口是给予POSIX标准的。
Linux的系统调用作为C库的一部分提供。
C库实现了Unix系统的主要API,包括标准C库函数和系统调用接口,即POSIXdM大部分API。
Unix的接口设计——“提供机制而不是策略”
三、系统调用
(一)要访问系统调用(syscall),通常通过C库中定义的函数调用来进行系统调用。
(二)系统调用通过返回一个long型的返回值来表示成功或者错误 ,用一个负的返回值来表明错误,返回0代表成功。系统调用出现错误的时候会把错误码写入errno全局变量 , 通过perror()库函数可以把该变量翻译成用户可以理解的错误字符串
(三)定义系统调用:asmlinkage long sys_getpid(void) (asmlingkage是一个编译指令,通知编译器仅从栈中提取该函数的参数。所有的系统调用都需要这个限定词。
其次, 返回值long。 为了保证32位和64位系统的兼容,系统调用在用户空间返回值int,内核空间long 。最后,注意系统调用getpid()在内核中被定义成sys_getpid().
系统调用号:
每个系统调用号独一无二,一旦分配就不能再有任何变更。
执行系统调用时,通过系统调用号指明,进程不会提及系统调用的名称。
未实现系统调用——sys_ni_syscall(),返回-ENOSYS,针对无用的系统调用。
系统调用的性能:
设计原则:简洁、高效
原因:
- 上下文切换时间短
- 系统调用处理程序和每个系统调用本身都很简洁
四、系统调用处理程序
通知内核的机制是软中断:通过引发一个异常来促使系统切换到内核态中去执行异常处理程序,即系统调用处理程序system_call()。
中断号128,指令如下:int 128 或者 int 0x80 退出是iret
(一)指定恰当的系统调用
- eax寄存器:将系统调用号传递给内核
- system_call():与NR_syscall比较,检查有效性
- call *sys_call_table(,%rax,8):执行相应的系统调用
(二)参数传递
- x86系统,ebx,ecx,edx,esi,edi按顺序存放前五个参数。
- 需要6个及以上参数,应用一个单独的寄存器存放指向这些参数在用户空间地址的指针。
- 返回值存放在eax。
《LINUX内核设计与实现》第五章学习总结的更多相关文章
- Linux内核设计与实现 第五章
1. 什么是系统调用 系统调用就是用户程序和硬件设备之间的桥梁. 用户程序在需要的时候,通过系统调用来使用硬件设备. 系统调用的存在意义: 1)用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备 ...
- linux及安全《Linux内核设计与实现》第一章——20135227黄晓妍
<linux内核设计与实现>第一章 第一章Linux内核简介: 1.3操作系统和内核简介 操作系统:系统包含了操作系统和所有运行在它之上的应用程序.操作系统是指整个在系统中负责完成最基本功 ...
- 《linux内核设计与实现》第一章
第一章Linux内核简介 一.unix 1.Unix的历史 Unix是现存操作系统中最强大和最优秀的系统. ——1969年由Ken Thompson和Dernis Ritchie的灵感点亮的产物. — ...
- Linux内核设计与实现 第十七章
1. 设备类型 linux中主要由3种类型的设备,分别是: 设备类型 代表设备 特点 访问方式 块设备 硬盘,光盘 随机访问设备中的内容 一般都是把设备挂载为文件系统后再访问 字符设备 键盘,打印机 ...
- 《linux内核设计与实现》第二章
第二章 从内核出发 一.获取内核源码 1.使用Git(linux创造的系统) 使用git来获取最新提交到linux版本树的一个副本: $ git clone git://git.kernel.org/ ...
- linux及安全《Linux内核设计与实现》第二章——20135227黄晓妍
第二章:从内核出发 2.1获取源代码 2.1.1使用git Git:内核开发者们用来管理Linux内核源代码的控制系统. 我们使用git来下载和管理Linux源代码. 2.1.2安装内核源代码(如果使 ...
- Linux内核设计与实现 第三章
1. 进程和线程 进程和线程是程序运行时状态,是动态变化的,进程和线程的管理操作都是由内核来实现的. Linux中的进程于Windows相比是很轻量级的,而且不严格区分进程和线程,线程不过是一种特殊的 ...
- 《Linux内核分析》课程第五周学习总结
姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- Linux内核设计与实现 第四章
1. 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上同时运行的各个任务(也就是进程). 这个管理程序就是调度程序,功能: 决定哪些进 ...
- Linux内核设计与实现第五周读书笔记
第十八章 调试 18.1准备开始 需要的只是: 一个确定的bug.大部分bug通常都不是行为可靠而且定义明确的. 一个藏匿bug的内核版本. 相关的内核代码的知识和运气. 18.2内核中的bug 内核 ...
随机推荐
- DevExpress03、GridControl
设计数据源并绑定字段: 数据源可以是实现下列接口之一的任何类型: IList 接口,包括一维数组.List<T>等! IListSource 接口,例如,DataTable 和 DataS ...
- Pre标签 自动换行
<pre> 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre> 标签的一个常见应用就是用来表示计算机的源代码 ...
- Win10无法启动软件提示MSVCP110.dll丢失
遇到这种问题,第一种方法可以选择去https://www.microsoft.com/zh-CN/download/details.aspx?id=30679 官网去下载 vc++ 2012 安装和自 ...
- 10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.创建MySQL数据 create database solr; use solr; DROP TABLE ...
- POJ 2049— Finding Nemo(三维BFS)10/200
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/29562915 海底总动员.... 这个题開始 ...
- 列表操作方法,元祖,for循环嵌套
li = ['alex','wusir''女神']增 1.增加到列表末位 li.append() 连续增加,输入q停止 li = ['alex','wusir''女神'] while 1: s = i ...
- vagrant特性——基于docker开发环境(docker和vagrant的结合)-0-简介
原文https://www.hashicorp.com/blog/feature-preview-docker-based-development-environments Feature Previ ...
- ICSharpCode.SharpZipLib 开源压缩库使用示例
官方网站:http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx 插件描述: ICSharpCode.SharpZipLib.dl ...
- ASP.NET Response 下载文件
private void DownLoad(string fileName, string path) { FileInfo fi = new FileInfo(path); if (fi.Exist ...
- android asmack调用MultiUserChat.getHostedRooms方法出现空指针的异常解决方案
今天在做即时通讯群聊时,调用MultiUserChat.getHostedRooms(conn, SmackTools.getInstance().conn.getServiceName());方法获 ...