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

WEEK FIVE(3.21——3.27)扒开系统调用的“三层皮”(下)

SECTION 1 给MenusOS增加time和time-asm命令

1.操作步骤

进入实验楼

  1. 首先,强制(即 -rf命令)删除当前的menu
  2. 克隆一个新的menu(其中已经含有time了)。但是通过实践以及查询,实验楼中对连入外网进行了限制,所以在实验楼中输入下列语句会报错(也就是无法解析https://github.com的网址)

    git clone https://github.com/mengning/menu.git
  3. 进入menu之后,输入make rootfs,就可以自动编译

  4. 输入help,可以发现系统支持更多的命令:
    • help
    • version
    • quit
    • time
    • time-asm
  5. 那么,time和time-asm是如何实现的呢?
    • 进入test.c之后,查看main函数。与之相关的只有两条语句:

      • menuconfig("time","Show system Time",Time);
      • menuconfig("time-asm","Show system Time",Time(asm));
    • 此外,添加time函数和timeasm函数
  6. 附:关于网址解析解决过程(无法修改resolv.conf文件)后在实验楼的“问答”中查到实验环境限制连入外网
  7. 附:虚拟机中的实验过程(与20135211共同完成)
      • 按照第三周《构建一个简单的内核MenuOS》中的配置步骤,对kali虚拟机进行配置;然后更新内核版本到最新版
      • 启动init进程(由makefile中内容可以看出,init可执行文件是linktable.c,menu.c,test.c多个文件编译得到的);并且,此时的MenuOS内核已经添加了time以及time_asm系统调用
      • 再进行内核调试的时候,由于kali是64位环境,与实验楼中的调试方法略有不同

        • 启动内核到调试状态

          root@KaliYL:/usr/src/linux-source-4.4/arch/x86_64/boot# qemu-system-x86_64 -kernel bzImage -initrd /home/YL/rootfs.img -S -s//这里要加上-system-x86_64
        • 进行调试

          gdb /usr/src/linux-source-4.4/vmlinux
          (gbd) set arch i386:x86-64  
          (gdb)target remote:1234
          (gdb)b rest_init //(不能break 到 start_kernel,会报错)

2.小结

由此可见,给MenuOS增加time和time-asm命令需要:

  1. 更新menu代码
  2. 在main函数中增加menuconfig
  3. 增加对应的time和timeasm函数
  4. make rootfs

SECTION 2 使用gdb跟踪系统调用内核函数sys_time

1.操作步骤

  1. 进入内核,冻结启动

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
  2. 启动gdb
  3. 加载debug版本内核并连接到target地址
  4. 为处理time函数的系统调用systime设置断点之后,在menuOS中执行time。发现系统停在systime处。继续按n单步执行,会进入schedule函数。
  5. sys_time返回之后进入汇编代码处理,gdb无法继续跟踪
  6. 如果在syscall设置断点(entry32.S),然后输入c之后,发现是不会在sys_call处停下来的(因为这里是一处系统调用函数而不是正常函数)

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

1.int 0x80指令与systemcall是通过中断向量联系起来的,而API和对应的sys[函数]是通过系统调用号联系起来的

  • 这也印证了上周的学习内容:软中断触发系统调用,系统调用处理函数负责指派API对应的系统调用函数

2.系统调用机制的初始化

  1. trapgate函数中,涉及到了系统调用的中断向量和systemcall的汇编代码入口;一旦执行int 0x80,CPU直接跳转到system_call

3.简化后便于理解的system_call伪代码

  1. systemcall的位置就在ENTRY(systemcall)处;(其他中断的处理过程与此类似)

    • 501行的syscalltable是系统调用表(比如,对于time函数而言,在此处调用的就应该是systime)
    • 503行after_call之后,保存返回值
    • 505行要exit的时候,会有一个syscallexitwork,否则直接返回用户态
    • 进入syscallexitwork之后,简化为下图所示的伪代码
      • 19行,判断当前的任务是否需要处理syscallexitwork;一般来说,系统调用都需要处理一些系统调度,也就是需要“work”
      • 从第30行开始,跳转到workpending。有worknotifying也就是处理信号;work_reschedle也就是重新调度(调度完之后再restore all)

4.简单浏览system_call到iret之间的主要代码

  1. SAVE_ALL:保存现场
  2. syscall_call:调用了系统调用处理函数
  3. restore all:恢复现场(因为系统调用处理函数也算是一种特殊的“中断”)
  4. syscallexitwork:如3.中所述
  5. INTERRUPT RETURN:也就是iret,系统调用到此结束

思考总结

1.理解makefile

1 #
2 # Makefile for Menu Program
3 #
4
//1.以下类似于变量声明,就是将右侧的变量在代码中用左侧替代
5 CC_PTHREAD_FLAGS = -lpthread
6 CC_FLAGS = -c
7 CC_OUTPUT_FLAGS = -o
8 CC = gcc //2.CC 是一个全局变量,它指定你的Makefile所用的编译器,一般默认是gcc
9 RM = rm
10 RM_FLAGS = -f
11 12 TARGET = test
13 OBJS= linktable.o menu.o test.o //3.Define a macro for the object files;.o文件是unix下的中间代码目标文件
14 15 all: $(OBJS)
16 $(CC) $(CC_OUTPUT_FLAGS) $(TARGET) $(OBJS) //4.即 gcc -o XXX
17 rootfs: //5.挂载根文件系统(root files system),见下方解释
18 gcc -o init linktable.c menu.c test.c -m32 -static -lpthread //该句以下是编译顺序
19 gcc -o hello hello.c -m32 -static
20 find init hello | cpio -o -Hnewc |gzip -9 > ../rootfs.img
21 qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img
22 .c.o:
23 $(CC) $(CC_FLAGS) $<
24 25 clean:
26 $(RM) $(RM_FLAGS) $(OBJS) $(TARGET) *.bak

参考:

分析:

  • makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

  • 此外,在不同的系统中启动内核的起点有着不同的定义。在实际操作的kali虚拟机中,第21行即可更改为:

    qemu-system-x86-64 -kernel 4.3.0-kali-amd64 -initrd ../rootfs.img//kali是64位虚拟机

2.画出从systemcall到iret的流程图(参考entry32.S)

《Linux内核分析》第五周 扒开系统调用的三层皮(下)的更多相关文章

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

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

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

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

  3. Linux内核分析第五周 扒开系统调用的三层皮(下) (20135304 刘世鹏)

    作者:刘世鹏20135304  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给MenuOS增加t ...

  4. linux内核分析 第五周 扒开系统调用的三层皮(下)

    rm menu -rf 强制删除原menu文件 git clone http://github.com/mengning/menu.git 从github中克隆 cd menu 在test.c中增加上 ...

  5. LINUX内核设计第五周——扒开系统调用的三层皮(下)

  6. 《Linux内核分析》第四周 扒开系统调用的“三层皮”

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FOUR( ...

  7. Linux内核及分析 第五周 扒开系统调用的三层皮(下)

    实验内容: 1.执行rm menu -rf命令,强制删除原有的menu 2.使用git命令 git clone https://github.com/mengning/menu.git 克隆新的men ...

  8. Linux内核设计第五周——扒开系统调用三层皮(下)

    Linux内核设计第五周 ——扒开系统调用三层皮(下) 一.知识点总结 1.给MenuOS增加新的命令的步骤 更新menu代码到最新版 test.c中main函数里,增加MenuConfig() 增加 ...

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

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

随机推荐

  1. js事件绑定细节说明

    javascript绑定事件: 经常用jQuery去写,时间长了对原生态的js事件绑定的知识会慢慢淡化或者遗忘了,必须翻出来再次总结,今天再次把js原生态事件的处理做个总结. 从最初开始,谁刚接触ja ...

  2. CF#335 Freelancer's Dreams

    Freelancer's Dreams time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. 数据结构:后缀自动机 WJMZBMR讲稿的整理和注释

    链接放在这里,有点难理解,至少我个人是的. 后缀自动机是一种有限状态自动机,其功能是识别字符串是否是母串的后缀.它能解决的问题当然不仅仅是判断是不是后缀这种事,跟字符串的连续子串有关的问题都可以往这个 ...

  4. [转]maven安装以及eclipse配置maven

    转自:http://jingyan.baidu.com/article/295430f136e8e00c7e0050b9.html 方法/步骤 下载maven的bin,在apache官方网站可以下载. ...

  5. HDU 2818 (矢量并查集)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2818 题目大意:每次指定一块砖头,移动砖头所在堆到另一堆.查询指定砖头下面有几块砖头. 解题思路: ...

  6. A Simple C++ Template Class that Matches a String to a Wildcard Pattern

    A recently implemented enhanced wildcard string matcher, features of which including, Supporting wil ...

  7. jquery delay()介绍及使用指南

    .delay()是用来在jQuery动画效果和类似队列中是最好的.但是,由于其本身的限制,比如无法取消延时——.delay(),它不是JavaScript的原生 setTimeout函数的替代品,这可 ...

  8. 转:js-sdk探索之微信网页分享

    原文地址 微信是一个很不错的传播平台,最近公司需要做一个新年贺卡,使用html5制作一个很小的动画,然后发送给客户,不需要和后台有任何的联系,一个很简单的功能,需要利用微信的分享功能,毕竟微信分享的带 ...

  9. GridView合并表头、多重表头(转)

    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { switch (e.Row.RowType) ...

  10. 《深入.NET平台和C# 编程》内测纠错记录

    1.  .NET框架的核心组件包括(BD)(选择两项) A.CTS   (通用类型系统) B.CLR   (公共语言运行时,.NET的基础) C.CLS   (公共语言规范) D.FCL   (框架类 ...