Linux内核分析第六次作业
分析system_call中断处理过程
一、先在实验楼的虚拟机中MenuOs增加utsname和utsname-asm指令。
具体实现如下:
1、克隆最新新版本的menu,之后进入menu
2、进入test.c,完成之后make rootfs,使系统自动编译自动运行
3.设置分割点,用gdb追踪
4.设置断点
二、然后开始使用gdb追踪系统调用内核函数sys_time
1、设置断点sys_time
2.继续执行,系统会启动到menuos,执行time命令(可发现此命令执行到一半卡住了),可以看到出现了一个断点
3.继续单步执行,直到出现return i
4.设置断点(system_call),继续执行可发现time有返回
三、系统调用分析
系统调用时用户态进入内核态的唯一入口,常用的系统调用有:
控制硬件:如read/write调用;
设置系统状态或读取内核数据——getpid()、getpriority()、setpriority()、sethostname();
进程管理:fork()、clone()、execve()、exit()等。
- sys_call代码分析
push1 %eax /*将系统调用号压栈*/
SAVE_ALL
cmp1$(NR_syscalls),%eax /*检查系统调用号*/
jb nobadsys
mov1 $(-ENOSYS), 24(%esp) /*堆栈中的eax设置为-ENOSYS,作为返回值*/
jmp ret_from_sys_call
nobadsys:
call *sys_call_table(, %eax, 4) #调用系统调用表中调用号为eax的系统调用例程。
mov1 %eax,EAX(%esp) #将返回值存入堆栈中
jmp ret_from_sys_call
分析:
首先将系统调用号(eax)和可以用到的所有CPU寄存器保存到相应的堆栈中(由SAVE_ALL完成);
对用户态进程传递过来的系统调用号进行有效检查(eax是系统调用号,它应该小于NR_syscalls),如果是合法的系统调用,再进一步检测该系统调用是否正被跟踪。根据eax中的
系统调用号调用相应的服务例程。
服务例程结束后,从eax寄存器获得它的返回值,并把这个返回值存放在堆栈中,让其位于用户态eax寄存器曾存放的位置。然后跳转到ret_from_sys_call(),终止系统调用程序的
执行。
- save_all代码分析
#define save_all
cld;
push1 %es;
push1 %ds;
push1 %eax;
push1 %ebp;
push1 %edi;
push1 %esi;
push1 %edx;
push1 %ecx;
push1 %ebx;
mov1 $(__KERNEL_DS),%edx;
mov1 %edx, %ds;
mov1 %edx,%es;
分析:
SAVE_ALL将寄存器的参数压入到核心栈中(这样内核才能使用用户传入的参数)。因为子啊不同特权级之间控制转换时,INT指令不同于CALL指令,它不会将外层堆栈的参数
自动拷贝到内层堆栈中。所以在调用系统调用时,必须把参数指定到各个寄存器中。
四、从system_call开始到iret结束之间的整个过程,可以用流程图表示如下:

五、总结
在系统调用返回之前,可能会发生进程调度(call_schedule),其中可能还会发生中断上下文的切换和进程上下文的切换;
在当前进程的时候,有些信号可能需要处理。
内核可以抽象成是很多种不同的中断处理过程的集合
Linux内核分析第六次作业的更多相关文章
- LINUX内核分析第六周学习总结——进程的描述和进程的创建
LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...
- Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质
原文:Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质 Linux内核分析(六) 昨天我们对字符设备进行了初步的了解,并且实现了简单的字符设备驱动,今天我们继续对字符设备的某些方 ...
- LINUX内核分析第六周学习总结——进程的描述与创建
LINUX内核分析第六周学习总结--进程的描述与创建 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc ...
- linux内核分析第六周学习笔记
LINUX内核分析第六周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...
- Linux内核分析实验六
Linux内核分析实验六 进程控制块PCB——task_struct(进程描述符) 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_s ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- Linux内核分析第六周学习总结:进程的描述和进程的创建
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 ...
- "Linux内核分析"第六周实验报告
张文俊 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1.进程的描述 ...
- 【MOOC EXP】Linux内核分析实验六报告
程涵 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的描述和进程的创建 知识点梳理: ...
随机推荐
- redhat7.2安全基线BI
(一) Redhat linux7.2安全基线基本型(BI) 1. 密码复杂度策略 /etc/pam.d/system-auth文件中,增加内容 password requisite pam_ ...
- 安装Go插件遇到的问题及解决方法
1. 问题:在 Windows 平台下使用 go get 安装sqlite3 驱动时报错 The remote end hung up unexpectedly ? 原因及解决方法: 原因可能有两种: ...
- 版本控制——Version Control
版本控制是指对软件开发过程中各种程序代码.配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一. 版本控制最主要的功能就是追踪文件的变更.它将什么时候.什么人更改了文件的什么内容等信息忠实 ...
- 最全面的移动APP测试点
随着互联网,大数据时代的不断推进,演化.移动开发领域得到普遍普及,APP开发如潮水般涌现.下面我将详细介绍app的测试点: 首先我们先熟悉app测试基本流程: 1.1流程图 1.2测试周期 测试周期可 ...
- 『Python CoolBook』C扩展库_其三_简单数组操作
点击进入项目 这里的数组要点在于: 数组结构,array.array或者numpy.array 本篇的数组仅限一维,不过基础的C数组也是一维 一.分块讲解 源函数 /* Average values ...
- 『流畅的Python』第14章:可迭代的对象、迭代器和生成器
- IDEA-------破解方法
① 到这个地方下载 IntelliJ IDEA 注册码:http://idea.lanyus.com/ 就是这个jar包:JetbrainsCrack-2.6.10-release-enc.jar ...
- protobuf example make backup
# See README.txt. .PHONY: all cpp java python clean all: cpp #java python cpp: add_person_cpp list_p ...
- 汇编语言debug入门
进入windows操作系统,因为我的虚拟机用的是win7 64位,所以装了一个Dos Box 的软件来执行这些指令. 输入debug回车,这样就进入了debug模式. 1: 输入 -r 查看或者修改寄 ...
- ln 链接命令 简要说明 软硬链接关系说明
ln [选项] 目标 -s 创建符号链接(软链接) -f 强制创建链接 -i 覆盖前先询问 -v 显示创建链接过程 ln命令不能对目录创建硬链接,但可以创建软链接,对目录的软链接经常被用到 删除软链接 ...