【刘蔚然 原创作品转载请注明出处 《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. NoSql之MongoDB--Ubuntu下安装

    MongoDB只提供了64位LTS(长期支持)Ubuntu发行版的packages.例如,12.04 LTS,14.04 LTS,16.04 LTS等等. 1.导入被包管理系统使用的公钥 Ubuntu ...

  2. iOS之06-三大特性之继承

    继承 1.定义 继承是指一个对象直接使用另一对象的属性和方法. 继承:xx 是 xxx 2.实现 A { int _age; int _no; } B : A {// 继承的实现 int _weigh ...

  3. BZOJ3567 : AABB

    考虑以块大小为$32$将序列分块,设$s[i][j]$表示前$i$块和前$j$块矩形相交的对数,$f[i][j]$表示矩形$i$和前$j$块的相交个数. 如果矩形$i$和$j$相交,那么有: $x_1 ...

  4. html5 摇一摇事件监听

    先来看下html5的这几个特性: 1.deviceOrientation:方向传感器数据的事件,通过监听该事件可以获取手机静态状态下的方向数据: 2.deviceMotion: 运动传感器数据事件,通 ...

  5. 20145308刘昊阳 《Java程序设计》实验一 Java开发环境的熟悉 实验报告

    20145308刘昊阳 <Java程序设计>实验一报告 实验名称 Java开发环境的熟悉 实验内容 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试J ...

  6. objective-c 多线程注意的问题

    1.资源竞争:当每个线程都去访问同一段内存时,会导致所谓i资源竞争问题,这时候可以通过“@synchronized block”将实例变量包围起来,创建一个互斥锁, 这样你就可以确保在互斥锁中的代码一 ...

  7. 【BZOJ2456】mode 神奇的卡内存题

    以后把题解放在前面,估计没人看题解先看题... 内存1M,4个int(其实对内存的概念十分模糊),众数即为出现次数最多的数,可以用抵消的思想(但是众数不是可以是一大坨么...) #include &l ...

  8. word-wrap和word-break的区别

    最初只有word-wrap,当指定word-wrap: break-word;时将导致容器内的长单词换行且被切断. 后来IE发明了word-break:当应用word-break:break-all时 ...

  9. osg 路径 动画 效果

    osg 路径 动画 效果 转自:http://blog.csdn.net/zhuyingqingfen/article/details/8248157 #include <osg/Group&g ...

  10. 如何用PHP开发机器人。

    近段时间由于工作需要,需要写个QQ通知的功能,仔细百度了一下,发现了现有的码,现分享大家.特别应该注意的是腾讯公司并未提供过QQ直接通讯的API接口,不过很庆幸的是咋们还有个3g qq可以小小利用下, ...