深入理解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内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
随机推荐
- Java连载51-super关键字
一.super关键字 我们先看一个例子 package com.bjpowernode.java_learning; public class D51_ { public static void ...
- pyqt添加启动等待界面
一.实验环境 1.Windows7x64_SP1 2.anaconda3.7 + python3.7(anaconda集成,不需单独安装) 3.pyinstaller3.5 #使用pyinstalle ...
- spring cloud 2.x版本 Gateway路由网关教程
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...
- sed命令:删除匹配行和替换
删除以a开头的行 sed -i '/^a.*/d' tmp.txt -i 表示操作在源文件上生效.否则操作内存中数据,并不写入文件中.在分号内的/d表示删除匹配的行 替换匹配行: sed -i 's/ ...
- html的特殊符号对照表
HTML的特殊符号对照表. 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 Α Α Α Β Β Β Γ Γ Γ Δ Δ Δ Ε Ε Ε Ζ Ζ Ζ Η ...
- 【centOS】centOS7 下载
地址:http://mirrors.aliyun.com/centos/ 进入国内的阿里云的,这里CentOS 7提供了三种ISO镜像文件的下载:DVD ISO.Everything ISO.Mini ...
- MySQL UNION 查询
UNION 用来合并多个 SELECT 结果. 考察如下两个表: # t1 +----+---------+ | id | pattern | +----+---------+ | 1 | Divot ...
- C# - 操作Word文档小实验
前言 本篇主要记录:VS2019 WinFrm桌面应用程序实现对Word文档的简单操作. 准备工作 搭建WinFrm前台界面 添加必要的控件,如下图 NuGet包管理器 安装Microsoft.Off ...
- 黑马程序员面试宝典(Java)Beta6.0免费下载
场景 JavaSE基础 面向对象特征以及理解 访问权限修饰符区别 理解clone对象 JavaSE语法 java有没有goto语句 &和&&的区别 如何跳出当前的多重嵌套循环? ...
- katalon studio升级到6.3.3版本后如何生成测试报告
背景: katalon studio 6.3.0版本开始,默认不会生成测试报告,因此,原先自动化运行结果的邮件也就不会包含测试报告附件. 解决方法如下: 通过插件[basic reports]生成测试 ...