深入理解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内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
随机推荐
- Salesforce 开发整理(一)测试类最佳实践
在Sales force开发中完善测试类是开发者必经的一个环节,代码的部署需要保证至少75%的覆盖率,那么该如何写好测试类呢. 测试类定义格式如下: @isTest private class MyT ...
- OpenFOAM——过渡管中的湍流
本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL016:Turbulent Flow in a Transition Duct 一 ...
- React: React的复合组件
一.介绍 不论Web界面是多么的复杂,它都是由一个个简单的组件组合起来实现的,既然会创建一个简单的组件,那么复杂的组件就有了下手的切入点了.现在来实现一个简单的复合组件.一个颜色面板,一共三部分组成. ...
- c#汉字转拼音首字母全拼支持多音字
1.首先在NuGet安装pingyinConverter 2.下载-安装-引用ChineseChar.dll到项目中 官网了解:http://www.microsoft.com/zh-cn/downl ...
- Java设计模式:Simple Factory(简单工厂)模式
概念定义 简单工厂(Simple Factory)模式,又称静态工厂方法(Static Factory Method)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...
- 【语义分割】Stacked Hourglass Networks 以及 PyTorch 实现
Stacked Hourglass Networks(级联漏斗网络) 姿态估计(Pose Estimation)是 CV 领域一个非常重要的方向,而级联漏斗网络的提出就是为了提升姿态估计的效果,但是其 ...
- 微信网站登录doem
直接上代码 namespace CloudPrj.WeiXin { public partial class index : System.Web.UI.Page { ...
- 接口测试基础--Fiddler、Postman、Python实现对接口的测试
写在前面:本文主要的章节规划: 1.什么是接口测试 另外,有的时候会直接调用别的公司的接口,比如银行的.淘宝的.支付宝的,此时也需要做接口测试以及验证数据: 做接口测试的好处: 其中, ...
- CSS元素显示模式
CSS的元素显示模式 什么是元素显示模式 作用:网页的标签非常多,在不同的地方会用到不同类型的标签,了解他们的特点可以更好的布局我们的网页 元素的显示模式就是元素(标签)以什么样的方式进行显示,比如& ...
- Macbook触控板使用技巧
1. 在Storyboard鼠标右键可以直接拖线的,如果你用的是外接的第三方鼠标,没必要按着 control 键再用鼠标左键拖线 如果是触控板的话,双指按下去就可以直接拖线,带3Dtouch功能的触控 ...