系统调用的三层皮(下)

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

  ls

  rm menu -rf

  git clone xx(克隆新版本)

  cd menu 

  make rootfs(自动编译生成根文件系统)

                      help

                      version

                      time

                      time asm

   vi time.c(增加了time,tim-asm:0)更新menu代码到最新版;1)在main函数中增加menuconfig;2)增加对应的time函数和timeasm函数)3)make rootfs

二、使用gdb跟踪系统调用内核函数   sys_time

  qemu -kernel linux -3,18,6/arch/x86/boot/xxxxxxxxxxxxxx(启动qemu)

  gdb

  file linux -3,18,6/VMlinux    (debug加载)

  target remote:1234(链接  menuOS)

  b start_kernel

  c

  b sys_time

  c

  list(如果单步执行会进入schedule函数)

              s.

              s.

              s.

              return i;

              (sys_time 返回后进入汇编代码处理gdb无法继续跟踪)

              (执行 int 0x80之后执行 system_call对应的代码)

              b system_call  x

              c

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

  1.系统调用在内核代码中的工作机制和初始化

  2.trap_init();简化后便于理解的system_call伪代码

      kernel/entry.32.s

      entry(system_call)

        处理过程

  3.浏览system_call到iret之间的主要代码

      xxxxxxxxx

      save_all

      xxxxxxxxx

      syscall_call;

      call *sys_call_table(,%eax ,4)  (实际调用的系统服务程序)

      xxx

      xxx

      restore_all

四、实验

step1.

git clone https://github.com/mengning/menu.git   //克隆新版本的menu

cd menu       //进入menu文件夹

step2.

进入test.c 添加需要的函数

step3.

输入make rootfs    //生存根文件系统并启动

step4.

gdb跟踪调试分,别在start_kernel和sys_getpid两个函数的位置设置断点

流程图:

开始→保存现场(save_all)→系统调用表(call *sys_call_table)→  sys_call_exit→restore_all→iret→结束

↓                           ↑

sys_exit_work(work_pending

working_ restore)

调用机制的初始化在start_kernel里面的trap_init()函数里进行,这个函数里面包含了sys_call汇编代码的入口,初始化好了之后,一旦执行int 0x80,CPU就会自动跳转到sys_call来执行。

sys_call的相关代码的位置是Linux-3.18.6/arch/x86/kernel/entry_32.s,里面的ENTRY(system_call)为int 0x80后的下一条指令,因其不是一个正常的函数,所以CPU还不能对其进行跟踪。

由代码可知,系统调用的过程大致分为三个阶段:保存现场SAVE_ALL、调用系统调用相对应的处理函数如time、getpid等,call *sys_call_table()、恢复现场RESORE_ALL 最后ire结束,返回用户态。在这个过程中,可能 会用到syscall_exit_work,里面有关于进程调度的函数。

 

  

  

Linux内核分析(第五周)的更多相关文章

  1. LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)

    LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...

  2. LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下)

    LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...

  3. 20135327郭皓--Linux内核分析第五周 扒开系统调用的三层皮(下)

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

  4. linux内核分析第五周学习笔记

    linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  5. Linux内核分析第五周——扒开系统调用的“三层皮”(下)

    Linux内核分析第五周--扒开系统调用的"三层皮"(下) 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.1 ...

  6. Linux内核分析第五周学习总结——分析system_call中断处理过程

    Linux内核分析第五周学习总结--分析system_call中断处理过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  7. Linux内核分析——第五周学习笔记

    第五周 扒开系统调用的“三层皮”(下) 一.知识点总结 (一)给MenuOS增加time和time-asm命令 在实验楼中,首先 强制删除menu (rm menu -rf) 重新克隆一个新版本的me ...

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

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给MenuO ...

  9. linux内核分析 第五周

    一.实验相关 1.下载老师最新的menu文件,并在其中添加上周所编写的代码,并运行 下载 添加 运行 2.gdb调试跟踪 gdb设置跟踪文件(先进入linux-3.18.6所在的文件) gdb设置断点 ...

  10. “Linux内核分析”第五周报告

    张文俊+ 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 学习总结 1.给M ...

随机推荐

  1. 【Ansible 文档】【译文】Windows 支持

    see also:List of Windows Modules Windows Support Windows 支持 Windows: How Does It Work Windows:如何工作 正 ...

  2. css多行省略-webkit-box-orient打包编译后失效原因

    原css代码: .dialog-for-plan .dialog-table .type>p { display: -webkit-box; -webkit-box-orient: vertic ...

  3. python 之 string() 模块

    common string oprationsimport string1. string constants(常量) 1) string.ascii_letters       The concat ...

  4. Maven配置本地库加载ojdbc14-10.2.0.4.0.jar文件

    因为ojdbc14-10.2.0.4.0.jar是要收费的,所以Maven的远程库里没有这个资源,只能通过配置本地库来加载到J2EE工程里,做法如下:   第一步:在网上下载ojdbc14.jar,然 ...

  5. 【转】微信开发-NATAPP的使用

    1.为什么使用natapp 1.1 在进行微信公众号开发时,我们需要搭建网站,并且有可能需要将项目部署到外网可访问的域名上,并且随时都有可能修改网站内容进行调试.如果能够将内网ip映射到外网上,大大方 ...

  6. Android failed to start daemon

    异常描述:在Eclipse中运行Android项目时Console中出现: The connection to adb is down, and a severe error has occured. ...

  7. Linux中的do{...} while(0)

    摘抄自: <<Linux设备驱动开发详解(第二版)>> 在 Linux 内核中,经常会看到do{} while(0)这样的语句,许多人开始都会疑惑,认为do{} while(0 ...

  8. 页签中加按钮 odoo里面

    <notebook> <page string="订"> <field name="line_id" > <tree ...

  9. Mike的农场 BZOJ4177

    分析: 最小割,不选则割的建模题...(然而一开始我当成了费用流,简直丧心病狂...最后想到了最小割...) 对于条件一,直接建一条双向边就可以了,并且不计入sum中,因为这是作为费用的存在,让它跑出 ...

  10. WPF和WebBrowser JS交互

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...