20135202闫佳歆--week5 系统调用(下)--学习笔记
2016-03-22 17:53
381 查看
此为个人笔记存档
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,恢复现场。
这一部分可以视为上一节的整理。
相关文章推荐
- 前端知识体系
- 【云计算】使用docker搭建nfs实现容器间共享文件
- wave overfly
- [bzoj2154]Crash的数字表格
- my97时间控件的使用
- RecyclerView再封装
- 令人困惑的值传递和引用传递
- 正确配置 Nginx + PHP
- CentOS7.0下安装和配置zabbix2.4.5全过程及解决一些遇到的问题
- Android中LayoutParams总结和用法
- IT十八掌作业_java基础第十六天_GUI/socket
- 无法访问您试图使用的功能所在的网络位置 无法找到vcredist.msi的解决办法
- NFS文件系统简介及原理
- (java)快排方法求最大的第K个数
- 代码规范
- Unity中使用摇杆控制
- Unity中使用摇杆控制
- 自定义进度条
- Django--form生成select标签
- 数论专题训练2016.3.21