姓名:何伟钦

学号:20135223

( *原创作品转载请注明出处*)

( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

内容:1.使用gdb跟踪分析一个系统调用内核函数

2.根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图

一、给MenuOS增加time和time-asm命令

(一) 克隆并自动编译MenuOS

  1. rm menu -rf      //强制删除原menu文件

  2. git clone http://github.com/mengning/menu.git //从github中克隆

  3. cd menu   //进入menu目录

  4. make rootfs //运行自动编译脚本,生成根文件系统,启动MenuOS

(二)给MenuOS增加time和time-asm命令

1.更新menu代码到最新版

2.在test.c中main函数里,增加MenuConfig

3.增加对应的两个函数:Time和TimeAsm

4。make rootfs

二、使用gdb跟踪调试内核

1.运行MenuOS系统

在实验楼的虚拟机环境里,打击打开shell,使用命令

cd LinuxKernel/

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

2.调试运行

1)使用带参数命令启动MenuOS

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

输入help,可以看到当前的系统调用:

2)启动gdb,设置断点,运行

(gdb)file linux-3.18.6/vmlinux    //在出现gdb提示符后,加载符号文件

(gdb)target remote:1234         //建立和被调试程序的连接

(gdb)break start_kernel  //在start_kernel函数入口处设置断点

(gdb)break  sys_time     //在系统调用time的位置设置断点

(gdb)c   //继续输入c,使得系统运行到start_kernel处停住

(gdb)s   //单步执行

(gdb)finish // 将这个函数执行完

list可以查看内部的函数,直到sys_time返回后进入汇编代码处理,gdb无法继续进行追踪

扩展知识:

三、系统调用在内核代码中的处理过程

(一)系统调用在内核代码中的工作机制和初始化

main.c中start_kernel函数:trap_init()

set_system_trap_gate(SYSCALL_VECTOR,&system_call)    一执行int 0x80,系统直接跳转到system_call。

SYSCALL_VECTOR:系统调用的中断向量

&system_call:汇编代码入口

(二)system_call到iret之间的主要代码

1.SAVE_ALL:保存现场

2.syscall_call:调用了系统调用处理函数(call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,是                           实际的系统调度程序。                       sys_call_table:系统调用分派表)

3.restore all:恢复现场

4.syscall exit work:若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。work_pending -> work_notifysig,用来处理信号,可能call schedule:进程调度代码可能跳转到restore_all,恢复现场。

5. INTERRUPT RETURN:宏,也就是iret,系统调用到此结束

流程图如下:

《Linux内核分析》课程第五周学习总结的更多相关文章

  1. 《Linux内核分析》第五周学习笔记

    <Linux内核分析>第五周学习笔记 扒开系统调用的三层皮(下) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...

  2. 《Linux内核分析》第五周学习总结

    <Linux内核分析>第五周学习总结                                  ——扒开系统调用的三层皮(下) 姓名:王玮怡 学号:20135116 1.给menu ...

  3. 《Linux内核分析》第五周学习总结 扒开系统调用的三层皮(下)

    扒开系统调用的三层皮(下) 郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给Men ...

  4. 《Linux 内核分析》第五周

    [李行之原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] <Linux内 ...

  5. 《Linux内核分析》第八周学习笔记

    <Linux内核分析>第八周学习笔记 进程的切换和系统的一般执行过程 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163 ...

  6. 《Linux内核分析》第七周学习笔记

    <Linux内核分析>第七周学习笔记 可执行程序的装载 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

  7. 《Linux内核分析》第六周学习笔记

    <Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

  8. 《Linux内核分析》第三周学习笔记

    <Linux内核分析>第三周学习笔记 构造一个简单的Linux系统MenuOS 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.stud ...

  9. 《Linux内核分析》第八周学习总结

    <Linux内核分析>第八周学习总结                                      ——进程的切换和系统的一般执行过程 姓名:王玮怡  学号:20135116 ...

  10. 《Linux内核分析》第七周学习总结

    <Linux内核分析>第七周学习总结                         ——可执行程序的装载 姓名:王玮怡  学号:20135116 一.理论部分总结 (一)可执行程序的装载 ...

随机推荐

  1. 折射向量计算(Refraction Vector Calculation)

    上个月学习Peter Shirley-Ray Tracing in One Weekend的系列三本书,收获真的很多.这个系列的书真的是手把手教你如何从零开始构建一个光线跟踪渲染器,对新手(像我)非常 ...

  2. 极限编程核心价值:沟通(Communication)

    原文:https://deviq.com/communication 极限编程核心价值:简单(Simplicity) 极限编程核心价值:沟通(Communication) 极限编程核心价值:反馈(Fe ...

  3. 基于Map的简易记忆化缓存

    背景 在应用程序中,时常会碰到需要维护一个map,从中读取一些数据避免重复计算,如果还没有值则计算一下塞到map里的的小需求(没错,其实就是简易的缓存或者说实现记忆化).在公司项目里看到过有些代码中写 ...

  4. linux配置路径PATH问题

    临时:           终端输入          export PATH=/myPath:$PATH  等号左右无空格   永久:           在用户家目录下即-目录,         ...

  5. Breaking Down Type Erasure in Swift

    Type Erasure Pattern We can use the type erasure pattern to combine both generic type parameters and ...

  6. 【转】Tomcat连接器:Coyote框架

    不论Tomcat的容器设计得如何精妙,本质上Tomcat就是个http服务器,需要从socket中获得HTTP数据流:另一方面,容器只能处理封装好的org.apache.coyote.Request ...

  7. Windows连接Linux虚拟机里面的Docker容器

    一.Windows.Linux虚拟机.docker关系图 如果此时在Windows宿主机中pingDocker容器是ping不同的,因为在宿主机上没有通往172.17.0.0/24网络的路由,宿主机会 ...

  8. 前端:background 设置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. JAVA框架:hibernate(二)

    一.事务操作. 代码: @Test public void tr_Up(){ Session session=hibernateUtils.getSession(); Transaction tran ...

  10. statefulSet + headless service 学习记录 service :selector --> template :label

    1.statefulset.yaml apiVersion: apps/v1kind: StatefulSetmetadata:   name: webspec:    serviceName: &q ...