《Linux内核原理与分析》第六周作业


一.本周内容概述:

  • 学习系统调用的相关理论知识,并使用库函数API和C代码中嵌入汇编代码两种方式使用getpid()系统调用
  • 学习系统调用system_call的处理过程,在MenuOS中运行getpid命令,通过gdb跟踪调用time函数的过程
  • 分析system_call代码对应的工作过程

二.本周学习内容:

1.实验楼环境研究MenuOS

1.1 在MenuOS中添加并运行getpid命令

  • 进入LinuxKernel目录,删除menu目录,然后从github上克隆一个menu
  • 运行make rootfs对menu内文件进行编译,打开MenuOS输入help查询系统调用函数



    实践截图如下:

  • 在menu目录中找到test.c文件打开,添加并写入getPid()方法

  • 由于test.c种通过MenuConfig()定义了调用函数名,在MenuOS中直接输入pid可以调用,获得当前进程为1

    实践截图如下:

1.2 gdb跟踪调用time函数的过程

  • 退回LinuxKernel目录,shift+ctrl+o切换横屏,然后执行如下命令

实践截图如下:



可以发现qemu已经被挂起。

  • 打开gdb,在start_kernel设置断点,执行如下命令:
file linux-3.18.6/vmlinux
target remote:1234
b start_kernel

实践截图如下:

  • 继续执行后面的程序,在sys_time函数中设置断点,在MenuOS中输入time后执行gdb

    实践截图如下:



  • 调用list,可以显示当前断点附近代码内容

    实践截图如下:

  • 对sys_time函数进行跟踪,最终显示系统时间

    实践截图如下

1.3 system_call代码对应的工作过程分析

  • 编辑linux-3.18.6/arch/x86/kernel/entry_32.S,查看system_call函数代码

    实践截图如下:





  • 分析system_call代码,系统调用的流程大致为

2.VMware虚拟机环境完成云班课编译内核练习

  • 编写系统调用函数 ,修改sys.c文件

实践截图如下:

  • 修改syscalls.h文件

实践截图如下:

  • 修改syscall_64.tbl文件

实践截图如下:

  • 编译内核,在linux-5.0.1文件夹里输入以下命令
sudo make clean
sudo make oldconfig
sudo make bzImage
sudo make modules
sudo make modules_install
sudo make install

实践截图如下:

总耗时3小时左右

  • grub引导,修改grub参数
sudo update-grub    //重新更新grub配置

实践截图如下:

  • 重启虚拟机,在VMware显示界面长按shift进入grub

    实践截图如下:

  • 调用系统函数,编写调用函数

    实践截图如下:

  • 最终实验结果

    实践截图如下:


三.总结与疑难

这一周主要学习了Linux内核系统调用的过程,并通过gdb和代码分析了调用过程。一般情况下,在用户态调用time()函数时,实际上调用了系统函数sys_time(),而用户态中有一个系统调用库函数xyz(),里面通过中断向量0x80触发system_call中断服务程序入口这段汇编代码,由用户态切换到内核态。首先通过SAVE_ALL保护现场,然后通过system_call函数中调用分配表找到系统调用内核处理函数指针,调用函数后通过restore_all和INTERRUPT_RETURN(iret)恢复现场并返回系统调用到用户态结束。以上system_call调用为软中断,和其他所有中断类似,可以推广到一般的中断处理过程。

QUSTION:

  • 系统调用处理程序system_call 并不是系统调用服务例程,系统调用服务例程是对一个具体的系统调用的内核实现函数,而系统调用处理程序是在执行系统调用服务例程之前的一个引导过程,是针对INT 0x80这条指令,面向所有的系统调用的。

四.下周计划

  • [ ] 完成书本上的课后习题
  • [ ] 继续使用虚拟机环境研究内核

2019 年 10月 26日

2019-2020-1 20199329《Linux内核原理与分析》第六周作业的更多相关文章

  1. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

  2. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  3. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  4. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  5. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  6. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  7. 2019-2020-1 20209313《Linux内核原理与分析》第二周作业

    2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  10. 2018-2019-1 20189221《Linux内核原理与分析》第二周作业

    读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...

随机推荐

  1. Spring Boot整合Thymeleaf视图层

    目录 Spring Boot整合Thymeleaf Spring Boot整合Thymeleaf 的项目步骤 Thymeleaf 语法详解 Spring Boot整合Thymeleaf Spring ...

  2. SSM项目启动的三种方式

    SSM整合Maven项目的三种启动方式 项目部署如图: 1.从父工程的的tomcat插件中直接启动 2.从web子工程的tomcat插件中启动,(需要先执行父工程的install) 如果没有执行父工程 ...

  3. Window.requestAnimationFrame()动画更新

    概述 Window.requestAnimationFrame()方法告诉浏览器你希望执行动画,并且再下一次重绘之前要求浏览器调用一个特定的函数去更新动画.该方法把一个回调函数作为参数,该回调函数会在 ...

  4. 1098 Insertion or Heap Sort (25分)

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  5. 1036 Boys vs Girls (25分)(水)

    1036 Boys vs Girls (25分)   This time you are asked to tell the difference between the lowest grade o ...

  6. 1011 World Cup Betting (20 分)

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  7. java编写规范

    编码规范 转载于:https://www.cnblogs.com/ftl1012/p/javaCode.html 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的 ...

  8. rest_framework-序列化-1

    序列化 定义模型类 from django.db import models # Create your models here. class StuModel(models.Model): SEX_ ...

  9. django内置的分页功能

    django内置的分页功能 # 先导入需要查询的模型类 from game.models import Score # 导入内置的分页功能 from django.core.paginator imp ...

  10. Django -->admin后台(后台管理可以直接往数据库添加数据)

    一.使用pymysql时,必须加这两行(#如果使用mysql的数据库,请进行伪装 pymysql伪装为MySQLdb) import pymysqlpymysql.install_as_MySQLdb ...