20135202闫佳歆--week5 系统调用(下)--学习笔记
此为个人笔记存档
week 5 系统调用(下)
一、给MenuOS增加time和time-asm命令
这里老师示范的时候是已经做好的了:
rm menu -rf 强制删除
git clone http://github.com/mengning/menu.git 克隆相关信息
cd menu
make rootfs 一个脚本,自动编译自动生成根文件系统,并自动启动MenuOS
如何实现?
- 更新menu代码到最新版
- test.c中main函数里,增加MenuConfig()
- 增加对应的两个函数,Time和TimeAsm
- make rootfs 自动编译脚本
二、使用gdb跟踪系统调用内核函数sys_time
之前已经学习过调试内核的方法如下:
使用gdb跟踪调试内核
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
另开一个shell窗口gdb
(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行 加载符号表
跟踪系统调用内核函数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 # 是可以设置断点的,但是这段是汇编代码,运行时不能在这个断点处停下逐句分析。
system_call不是一个正常意义上的函数,只是一段汇编代码的起点。
三、系统调用在内核代码中的处理过程
1.系统调用在内核代码中的工作机制和初始化
※系统调用的时间很重要。
以system_call为例:
系统调用机制的初始化:

trap_init里面有一个set_system_trap_gate函数,函数定义中有系统调用的中断向量SYSCALL_VECTOR****和汇编代码入口system_call。
一旦执行int 0x80,系统直接跳转到system_call来执行。
2.简化后便于理解的system_call伪代码
system_call代码在 arch/x86/kernel/entry_32.S中,有一个ENTRY(system_call)。

系统调用就是一个特殊一点的中断,所以也有保护现场与恢复现场。
可以从上图中看到SAVE_ALL
sys_call_table是系统调用分派表
syscall_after_all,需要先保存返回值
sys_exit_work
没有这个就restore_all,返回用户态。
一旦进入sys_exit_work:会有一个进程调度时机。
(从此往后为按照下列简化代码的)需要跳转到work_pending,worknotifysig处理信号
work_resched处理新调度
这段相关代码非常长有几百行,所以视频里老师简化了一下,如下图:

照旧从ENTRY(system_call)看起
下面有SAVE_ALL,也有sys_call_table系统调用分派表,对应的处理函数是:
sys_call_table(,%eax,4)
这里在上周的学习笔记里提到过,JMP(EAX*4 + system_xxx)
退出时会判断当前任务是否需要处理sys_exit_work,如果不需要,就restore all,返回用户态。
从以上可以看出:
- 在系统调用返回之前,可能发生进程调度,进程调度里就会出现进程上下文的切换
- 进程间通信可能有信号需要处理
理解后,可以将内核视为一系列中断指令的集合。(内核线程当做一般进程理解)
3.简单浏览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,恢复现场。
这一部分可以视为上一节的整理。
20135202闫佳歆--week5 系统调用(下)--学习笔记的更多相关文章
- 20135202闫佳歆--week5 课本18章学习笔记
第十八章 调试 内核级开发的调试工作远比用户级开发艰难的多. 一.准备开始 准备工作需要的是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 在这一章里,调试的主要思想是让bug重现 ...
- 20135202闫佳歆--week4 系统调用(上)--学习笔记
此为个人笔记存档 week 4 系统调用(上) 一.用户态.内核态和中断处理过程 用户通过库函数与系统调用联系起来. 1.内核态 在高执行级别下,代码可以执行特权指令,访问任意的物理地址. 2.用户态 ...
- 20135202闫佳歆--week5 分析system_call中断处理过程--实验及总结
week 5 实验:分析system_call中断处理过程 一.使用gdb跟踪分析一个系统调用内核函数(上周选择那一个系统调用)--getpid 复习视频: 如何实现? - 更新menu代码到最新版 ...
- 20135202闫佳歆--week3 跟踪分析Linux内核的启动过程--实验及总结
实验三:跟踪分析Linux内核的启动过程 一.调试步骤如下: 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd r ...
- 20135202闫佳歆--week 7 Linux内核如何装载和启动一个可执行程序--实验及总结
week 7 实验:Linux内核如何装载和启动一个可执行程序 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.git c ...
- 20135202闫佳歆--week 9 期中总结
期中总结 前半学期的主要学习内容是学习mooc课程<Linux内核分析>以及课本<Linux内核设计与实现>. 所涉及知识点总结如下: 1. Linux内核启动的过程--以Me ...
- 20135202闫佳歆--week2 一个简单的时间片轮转多道程序内核代码及分析
一个简单的时间片轮转多道程序内核代码及分析 所用代码为课程配套git库中下载得到的. 一.进程的启动 /*出自mymain.c*/ /* start process 0 by task[0] */ p ...
- 20135202闫佳歆--week6 分析Linux内核创建一个新进程的过程——实验及总结
week 6 实验:分析Linux内核创建一个新进程的过程 1.使用gdb跟踪创建新进程的过程 准备工作: rm menu -rf git clone https://github.com/mengn ...
- 20135202闫佳歆--week6 进程的描述与创建--学习笔记
此为个人学习笔记存档! week 6 进程的描述与创建 一.进程的描述 1.进程控制块task_struct 以下内容来自视频课件,存档在此. 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述 ...
随机推荐
- XtraEditors四、TextEdit、ButtonEdit、PictureEdit、RadioGroup、PopupContainerEdit
TextEdit控件 以文本框的形式绑定各种形式的选择框: 文本框设置 输入 密码 字符 时, 要有 * 号掩盖输入的字符, 代码如下: textEdit1.Properties.PasswordCh ...
- 远程登录Linux(window下操作Linux)
参考文章:http://www.runoob.com/linux/linux-remote-login.html 1.Window系统上 Linux 远程登录客户端有SecureCRT, Putty, ...
- initialProps被React-Navigation的navigation属性覆盖解决方案
怎么开场对我来说一个是个很纠结的问题,Emmm这应该算个好开场. 最近在做一个RN的app端调试工具,在把它嵌入原生app中的时候遇到了一个问题,RN组件里面接受不到原生传过来的initialProp ...
- 10行代码爬取全国所有A股/港股/新三板上市公司信息
摘要: 我们平常在浏览网页中会遇到一些表格型的数据信息,除了表格本身体现的内容以外,可能还想透过表格背后再挖掘些有意思或者有价值的信息.这时,可用python爬虫来实现.本文采用pandas库中的re ...
- BZOJ4184:shallot(线段树分治,线性基)
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱 ...
- php 两个二维数组重组新数组,数组下标不同
Array ( [0] => Array ( [PosNum] => 27025008 [start_time] => 20180328164929 [type] => 0 ) ...
- Array对象的方法
* Array.isArray(对象)---->判断这个对象是不是数组 * instanceof关键字 * .concat(数组,数组,数组,...) 组合一个新的数组 * .every(函数) ...
- VA_X安装
1,下载VA_X安装包: 地址:https://pan.baidu.com/s/16v5RFX2apjqvDy1Jw8A6Dg 密码:tmv0 解压后显示: 第一步: 第二步:将这个解压文件下的VA_ ...
- Zookeeper入门(二)之基础
在深入了解ZooKeeper的运作之前,让我们来看看ZooKeeper的基本概念.本文主要包含如下内容:1.Architecture(架构)2.Hierarchical namespace(层次命名空 ...
- WorldWind源码剖析系列:地形访问器类TerrainAccessor
地形访问器类TerrainAccessor 地形访问器类TerrainAccessor提供了对地形(高程)Terrain (elevation)访问的各种接口interface,是NltTerrain ...