深入理解Linux内核 学习笔记(8)
第八章 系统调用
API定义了一个给定的服务;系统调用是通过软中断向内核发出一个明确的请求。
API可能不调用系统调用,也可能调用多个系统调用。
Linux系统调用必须通过执行int 0x80,系统调用时用户态切换到内核态。
使用eax传递系统调用号。返回值0为成功,负数为程序错误码。
System_call()函数会检查current的flags域是否包含PF_TRACESYS为1,即是否在被跟踪执行。如果是,system_call()在系统调用服务例程执行之前,和之后调用syscall_trace(),允许收集current的信息。
传参:参数长度不能超过寄存器长度(32位),不能超过6个。Eax,ebx,ecx,edx,esi,edi。
动态地址检查:修正代码
内核态缺页异常的三种情况:
内核试图访问属于进程地址空间的页,但是,或者是相应的页框不存在,或者是内核试图去写一个只读页。
某一内核函数包含程序设计错误,当这个函数运行时就引起异常;或者,可能由于瞬时的硬件错误引起异常。
本章所讨论的一种情况:个系统调用服务例程试图读写-.个内存区,而该内存区的地址是通过系统调用参数传递来的,但却不属于进程的地址空间。
异常表:把访问进程值空间的任一条内核指令放异常表里。发生页异常时,do_page_fault()处理程序检查异常表,有就是由非法系统调用参数引起的,不然就是更严重的bug。
Linux定义了几个异常表。主要的异常表在建立内核程序映像时由C编译器自动生成。它存放在内核代码段的__ex_table部分,其起始与终止地址由C编译器产生的两个符号: __ start_ __ ex_ table和_ . stop__ ex_ table 标识。
此外,每个动态装载的内核模块(参看附录二)都包含有自己的局部异常表。这个表是在建立模块映像时由C编译器白动产生的,当把模块插人到运行中的内核叶把这个表装入到内存。
修正代码为几条汇编指令,解决缺页异常引发的问题
封装例程:内核也需要调用系统调用,但不能用库函数。
尽管系统调用主要由用户态进程使用,但也可以被内核线程调用,内核线程不能使用库的数。为了简化桕应的封装例程的声明,Linux定义了六个从_ syscal10到一syscall5的宏。
例程的声明。然而,不能用这些宏来为超过5个参数(系统调用号除外)的系统调用或产生非标谁返回值的系统调用定义封装例程。
每个宏严格地需要2+2xn个参数.n是系统调用的参数个数。前两个参数指明系统调用的返回值类型和名字;每-对附加参数指明相应的系统调用参数的类型和名字。因此,以fork(}系统调用为例,其封装例程可以通过如下语句产生:.
.syscall0lint, fork)
而write()系统调用的封装例程可以通过如下语句生产:
_ syscall3(int, write, int, fd, const char *, buf, unsigned int, count )
深入理解Linux内核 学习笔记(8)的更多相关文章
- 深入理解Linux内核 学习笔记(1)
1.用户和用户组 每个用户是一个或多个用户组的一名成员,组由唯一的用户组标识符(user group ID)标识.每个文件的相关权限也恰好与一个组相对应. root为超级用户, 2.模块 为了达到微内 ...
- 深入理解Linux内核 学习笔记(5)
第五章 定时测量 内核必须显式地与三种时钟打交道:实时时钟(Real Time Clock, RTC).时间标记计数器(Time Stamp Counter, TSC)及可编程间隔定时器( Prog ...
- 深入理解Linux内核 学习笔记(4)
第四章 中断和异常 中断通常被分为同步中断和异步中断,同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断异步中断是由其他硬件设备依照CPU时 ...
- 深入理解Linux内核 学习笔记(3)
第三章 进程 可以看到很多熟悉的结构体 进程状态: 可运行状态(TASK_ RUNNING) 进程要么在CPU上执行,要么准备执行. 可巾断的等待状态(TASK_ INTERRUPTIBLE) 进程被 ...
- 深入理解Linux内核 学习笔记(2)
第二章 :内存寻址 略.基本同计算机组成原理中的讲述 内核代码和数据结构会存储在一个保留的页框中. 常规Linux安装在RAM物理地址0x00100000开始的地方.因为:页框0是由BIOS使用,存放 ...
- 20135316王剑桥Linux内核学习笔记
王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记-1.简介和入门
原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
随机推荐
- 趣谈Linux操作系统学习笔记:第二十四讲
一.小内存的分配基础 1.kmem_cache_alloc_node的作用 通过这段代码可以看出,它调用了kmem_cache_alloc_node函数,在task_struct的缓存区域task_s ...
- 【JS】JS实现Html转义和反转义(html编码和解码)的方法总结
1.JS实现html转义和反转义主要有两种方式: 1).利用用浏览器内部转换器实现html转义: 2).用正则表达式实现html转义: 2.封装的JS工具类: var HtmlUtil = { /*1 ...
- 深入理解java中的byte类型
作者 | 进击的石头--GO! 来源 | https://www.cnblogs.com/zl181015/p/9435035.html#4432849 Java也提供了一个byte数据类型,并且是基 ...
- 前端之本地存储和jqueryUI
本地存储 本地存储分为cookie,以及新增的localStorage和sessionStorage 1.cookie 存储在本地,容量最大4k,在同源的http请求时携带传递,损耗带宽,可设置访问路 ...
- 屏幕输入转换为int//方法大注释
可以使用两种方法: using System; namespace 方法测试 { class Program { static void Main(string[] args) { Console.W ...
- MySqlBulkLoader 中文乱码
MySQL驱动:MySqlConnector GitHub地址:https://github.com/mysql-net/MySqlConnector.git 文档地址:https://mysql-n ...
- CAD画三维图怎么渲染?一分钟教你快速操作
从事过CAD相关工作的都知道,CAD绘制的方式有二维平面图以及三维图形,三维图形,画三维图方式也是比较简单的.那当然三维图画完后一般还需要进行渲染操作,步骤也是比较简洁的.下面就来给大家操作一下CAD ...
- CSS符合选择器
CSS复合选择器 后代选择器 后代选择器又称为包含选择器,可以选择父元素里面的子元素.其写法就是把外层标签写在前面,内层标签写在后面,中间用空格分隔,当标签发生嵌套时,内层标签就成为外层标签的后代 元 ...
- 使用Dynamics 365 CE Web API查询数据加点料及选项集字段常用查询
微软动态CRM专家罗勇 ,回复336或者20190516可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me. 紧接上文:配置Postman通过OAuth 2 implicit ...
- CODING 签约天津大学,助力高校“产学”接轨
近日,CODING 与天津大学顺利达成合作,将通过 CODING 的一站式 DevOps 解决方案为天津大学师生提供软件研发管理方面的先进理念和产品. 根据中共中央.国务院印发的<中国教育现代化 ...