20135317 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

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

1. 克隆并自动编译MenuOS

rm menu -rf 强制删除原menu文件
git clone http://github.com/mengning/menu.git 从github中克隆 cd menu
make rootfs 运行自动编译脚本,生成根文件系统,启动MenuOS

2. 给MenuOS增加time和time-asm命令

  • 更新menu代码到最新版
  • test.c中main函数里,增加MenuConfig
  • 增加对应的两个函数:Time和TimeAsm
  • make rootfs

二、调试内核

1. 使用gdb跟踪调试内核

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
------------分隔线------------
gdb
(gdb)file linux-3.18.6/vmlinux //加载符号表
(gdb)target remote:1234 //连接
  • b sys_time:在系统调用time的位置设置断点
  • c:在MenuOs里使用time,停在断点处

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

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

  • main.c中start_kernel函数:trap_init()
  • set_system_trap_gate(SYSCALL_VECTOR,&system_call)
    • SYSCALL_VECTOR:系统调用的中断向量
    • &system_call:汇编代码入口
  • 一执行int 0x80,系统直接跳转到system_call。

2. 系统调用——一个特殊的中断

  • SAVE_ALL:保存现场

  • call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,是实际的系统调度程序。

    • sys_call_table:系统调用分派表
  • syscall_after_all:保存返回值

  • 若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。

    • work_pending -> work_notifysig,用来处理信号

      • 可能call schedule:进程调度代码
      • 可能跳转到restore_all,恢复现场。
  • 若无sys_exit_work,就执行restore_all恢复,返回用户态。

  • INTERRUPT_RETURN <=> iret,结束。

- 在系统调用返回之前,可能发生进程调度,进程调度里就会出现进程上下文的切换。
- 进程间通信可能有信号需要处理。
- 可以将内核视为一系列中断指令的集合。

四、实践

1. 使用gdb跟踪分析122号系统调用内核函数:uname

  • 先执行rm menu -rf,强制删除原有的menu文件夹,使用git命令更新menu代码至最新版。

  • 在test.c中增加我编写的两个函数:Uname()和UnameAsm()

  • 在main函数中增加两个函数的MenuConfig命令项:

  • make rootfs编译错误:

    • 原因:忘记添加头文件<sys/utsname.h>
  • 编译运行,在MenuOS中输入help,可以查看当前所有的系统调用,分别执行uname、uname-asm进行系统调用:

  • 插入断点并调试:

2. 从system_call到iret

  • 简单流程

五、总结:从系统调用处理过程到一般的中断处理过程

系统调用就是特殊的一种中断

1. 保存现场

  • 在系统调用时,我们需要SAVE_ALL,用于保存系统调用时的上下文。
  • 同样,中断处理的第一步应该也要保存中断程序现场。
  • 目的:在中断处理完之后,可以返回到原来被中断的地方,在原有的运行环境下继续正确的执行下去。

2. 确定中断信息

  • 在系统调用时,我们需要将系统调用号通过eax传入,通过sys_call_table查询到调用的系统调用,然后跳转到相应的程序进行处理。
  • 同样,中断处理时系统也需要有一个中断号,通过检索中断向量表,了解中断的类型和设备。

3. 处理中断

  • 跳转到相应的中断处理程序后,对中断进行处理。

4. 返回

  • 系统调用时最后要restore_all恢复系统调用时的现场,并用iret返回用户态。
  • 同样,执行完中断处理程序,内核也要执行特定指令序列,恢复中断时现场,并使得进程回到用户态。

Linux内核分析第五周学习总结:扒开系统调用的三层皮(下)的更多相关文章

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

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

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

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

  3. Linux第五周学习总结——扒开系统调用的三层皮(下

    Linux第五周学习总结--扒开系统调用的三层皮(下) 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

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

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

  5. 20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 一.学习内容 (一 ...

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

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

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

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

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

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

  9. Linux内核分析第五周学习总结

    扒开系统调用的三层皮(下) 20135237朱国庆+ 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...

  10. 《Linux内核分析》第四周学习总结 扒开系统调用的三成皮(上)

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

随机推荐

  1. Oracle函数--字符串拼接

    常用的字符串聚合(拼接)函数介绍 1.WMSYS.WM_CONCAT 从oracle 10G开始支持,使用案例如下: select deptno,wmsys.wm_concat(ename) from ...

  2. IplImage 结构解读(转)

    typedef struct _IplImage { int nSize;                             /* IplImage大小 */ int ID;           ...

  3. cvMat结构体详解

    /* *CvMat矩阵头 */ typedef struct CvMat { int type; //数据类型,比如CV_32FC1含义是32位浮点型单通道,再比如CV_8UC3含义是8位无符号整型三 ...

  4. Logistic回归原理及公式推导[转]

    原文见 http://blog.csdn.net/acdreamers/article/details/27365941 Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素 ...

  5. 安装初始化mysql后,默认几个库介绍

    背景介绍:  当我们安装初始化mysql后,默认建了几个数据库,那么这些数据库有什么作用呢?mysql> show databases;+--------------------+| Datab ...

  6. maven项目修改java编译版本的方式

    背景 使用 maven 3.x 安装到本地后,创建的项目一般都是基于JDK1.5版本.而目前大多数的项目已经升级到1.6或以上,尤其是Servlet3.0 已经要求Java6或以上版本的环境,往往需要 ...

  7. Python error: ascii’/'utf-8′ codec can’t decode byte 0xb8 in position 50: ord

    字符串使用了费ascii编码的字符,也就是它代表的16进制的编码超过127. 解决这个问题可以使用下面的方法解决,其实就是设置默认的编码.python 2.x的默认编码是ascii,如果改为utf-8 ...

  8. 【netty】Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  9. 正则匹配<{$vcode}>变量

    $title="<{t}>您的验证码是:<{/t}><{$vcode}>,<{t}>请在注册页输入验证码并完成注册:验证码<{$vcod ...

  10. .NET微信自定义分享标题、缩略图、超链接及描述的设置方法

    前端Js引用: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> ...