zoukankan      html  css  js  c++  java
  • 《Linux内核分析》课程第五周学习总结

    姓名:何伟钦

    学号: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,可以看到当前的系统调用:
    enter description here

    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无法继续进行追踪enter description here

    扩展知识:

     

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

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

    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,系统调用到此结束

    流程图如下:

  • 相关阅读:
    漫谈PID——实现与调参
    匿名上位机的使用(51版)
    #if 和 #ifdef 条件编译注意
    关于HC04超声波模块测距的思考(51版)
    关于C语言文件操作
    C语言实现简易2048小游戏
    关于OELD屏显示电池电量的简易方法
    使用notepad++作为keil的外部编辑器
    2017年个人总结
    数据存入文件
  • 原文地址:https://www.cnblogs.com/20135223heweiqin/p/5324933.html
Copyright © 2011-2022 走看看