20135302魏静静——linux课程第五周实验及总结
linux课程第五周实验及总结
一、学习总结
给MenuOS增加time和time-asm命令(四步操作命令)
rm menu -rf 强制删除
git clone http://github.com/mengning/menu.git 克隆相关信息
cd menu
make rootfs 一个脚本,自动编译自动生成根文件系统,并自动启动MenuOS
使用gdb跟踪系统调用内核函数sys_time
(gdb)b sys_time
(gdb)c # 启动到MenuOs
// 在MenuOs中使用time,会停在time函数处
(gdb)list # 可以看到对应代码
(gdb)s # 单步执行
(gdb)finish # 将这个函数执行完
// 以上两步重复使用,可以看到sys_time函数中的函数,直到看见return i
// sys_time返回后进入汇编代码处理,gdb无法继续进行追踪
系统调用指令:
// 执行int 0x80之后执行system_call对应的代码
(gdb)b system_call # 是可以设置断点的,但是这段是汇编代码,运行时不能在这个断点处停下逐句分析。
系统调用的中断处理过程
系统调用流程图

- sys_call_table是系统调用分派表
- syscall_after_all,需要先保存返回值
sys_exit_work
没有这个就restore_all,返回用户态。
一旦进入sys_exit_work:会有一个进程调度时机
简化后便于理解的system_call伪代码

system_call到iret之间的主要代码
SAVE_ALL保存现场 call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,这段是实际的系统调度程序。 restore_all
INTERRUPT_RETURN,是个宏,实际上就是iret,结束。
这个过程中会有sys_exit_work
sys_exit_work中会有work_pending
work_pending中会有work_notifysig,用来处理信号
可能call schedule 进程调度代码
还可能跳转到restore_all,恢复现场。
从以上可以看出:
在系统调用返回之前,可能发生进程调度,进程调度里就会出现进程上下文的切换
进程间通信可能有信号需要处理
系统调用就是一个特殊一点的中断,所以也有保护现场与恢复现场。
二、实验:分析system_call中断处理过程
增加系统调用
- 在test.c中增加两个函数,Getpid和GetpidAsm



- make rootfs后,输入help会显示当前菜单

使用gdb调试
这里需要注意的就是,因为当前是在menu目录下,而所需要的镜像文件不在这个目录下,这时需要使用全路径,不然的话就会出现像上面第二张图的错误。给time处设置断点:

c运行之后,在MenuOs里使用time,可以看到它停了下来
20135302魏静静——linux课程第五周实验及总结的更多相关文章
- 20135302魏静静——linux课程第三周实验及总结
linux课程第三周实验及总结 一.实验:跟踪分析Linux内核的启动过程 使用gdb跟踪调试内核从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxKer ...
- 20135302魏静静——linux课程第六周实验及总结
linux课程第六周实验及总结 实验及学习总结 1.进程描述符task_struct数据结构 进程的作用: 将信号.进程间通信.内存管理和文件系统联系起来 操作系统的三大功能: 进程管理.内存管理.文 ...
- 20135302魏静静——linux课程第七周实验及总结
linux课程第七周实验及总结 实验及学习总结 1. 编译链接的过程和ELF可执行文件格式(以hello为例) GNU编译系统编译源码: 首先,运行C预处理器(cpp),将.c文件翻译成.i文件——g ...
- 20135302魏静静——linux课程第八周实验及总结
linux课程第八周实验及总结 实验及学习总结 1. 进程切换在内核中的实现 linux中进程切换是很常见的一个操作,而这个操作是在内核中实现的. 实现的时机有以下三个时机: 中断处理过程(包括时钟中 ...
- 20135302魏静静——Linux课程期中总结
Linux期中总结 Linux课程第一周实验及总结:[http://www.cnblogs.com/20135302wei/p/5218607.html] 冯诺依曼体系结构的核心思想是存储程序计算机. ...
- 20135302魏静静——linux课程第四周实验及总结
linux课程第四周实验及总结 一.实验 我选择的是第20号系统调用,getpid 代码如下: /* getpid.c */ #include <unistd.h> #include &l ...
- 20135302魏静静Linux内核分析第二周学习总结
操作系统是如何工作的 1. 小结:计算机是怎样工作的 三个法宝 存储程序计算机.函数调用堆栈.中断机制 两把宝剑 中断上下文.进程上下文的切换 2. 堆栈 堆栈是C语言程序运行时必须的一个记录调用路径 ...
- 《Linux内核分析》课程第五周学习总结
姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- Linux 第五周 实验: 分析system_call中断处理过程
姬梦馨 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用gdb跟踪分析一个系统调用内核函数 ...
随机推荐
- [C++] 跨平台的生成GUID方法
string GetGUID() { char szGUID[BUFF_SIZE]; #ifdef WIN32 GUID uuid; CoCreateGuid(&uuid); #else Tm ...
- jenkins multijob 插件使用
如果你想要停止对下游/上游工作链定义的混乱 当您想要添加具有层次结构的任务时,按顺序执行或并行执行 安装multijob插件可以让jenkins任务按照分组.顺序执行 jenkins版本:2.80 1 ...
- python--excel
import xlrd, xlwt # 读取Exceldef read_excel(excel_name, sheet_name): if excel_name and excel_name: all ...
- Struts2的OGNL的用法
1 <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1 ...
- 【opencv】c++ 读取图片 & 绘制点 & 绘制文字 & 保存图片
//read pic ]; sprintf(path, "%s%d/%s", image_dir.c_str(), cam_num, filename.c_str()); cv:: ...
- uchome android 开发记录
一.uchome 1.无法转移临时图片到服务器指定目录 cp_upload.php----------- function.cp.php ---------mobile_picture_tempora ...
- 前台js加密实例
1.base64加密 一个字节一般由8位表示,base64加密就是把8位表示转为6为表示,余下2位添0表示,故有个特点不能充分利用空间. 资源下载:jquery.js,base64.js // `ut ...
- java 多线程 day07 多线程共享数据
/** * Created by chengtao on 17/12/3. * 多个线程 如何共享数据? * 常见实例:多个窗口同时售卖火车票 */public class Thread0701_Mu ...
- MySQL · 引擎特性 · InnoDB redo log漫游(转)
前言 InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性. 和大多数关系型数据库一样, ...
- Python中i = i + 1与i + = 1的区别
+=是对原本的实例做加1运算,l=l+[1]是对l+[1]之后重新把值赋给叫l的变量(和原来的l不同) 区别在于,一个修改数据结构本身(就地操作)b + = 1而另一个只是重新分配变量a = a + ...