课本:第五章 系统调用的三层机制(下)

  • 中断向量0x80和system_call中断服务程序入口的关系
    0x80对应着system_call中断服务程序入口,在start_kernel函数中调用了trap_init函数,trap_init函数中调用了set_system_trap_gate函数,其中有系统调用的中断向量0x80和system_call中断服务程序入口的函数指针,system_call被声明为一个函数,通过set_system_trap_gate函数绑定了中断向量0x80和system_call中断服务程序入口之后,一旦执行int 0x80,CPU就直接跳转到system_call这个位置执行。
  • 系统调用用户态接口和系统调用的内核处理函数是通过系统调用号匹配起来的
  • system_call中断服务程序执行流程
    从entry(system_call)开始执行,根据系统调用号来查sys_call_table表中的位置,调用系统调用对应的处理函数,在syscall_exit里面判断当前任务是否需要处理syscall_exit_work,进入syscall_exit_work,这是最常见的进程调度时机点。
    其中sys_call_table(,%eax,4)可以理解为,分派表中每个表项占4个字节,所以先把系统调用号(eax)乘以4,再加上sys_call_table分派表的起始地址,得到系统调用号对应的系统调用内核处理函数的指针。
    system_call的执行流程图如下图所示:

    其中,cmpl部分是检查系统调用号(应小于nr_syscalls),不合法即跳入syscall_badsys异常处理,movl部分是保存返回值到栈中,syscall_exit检查是否有任务需要处理,有则进入syscall_exit_work,无则恢复现场。

    实验:分析system_call中断处理过程

    上周我进行实验选择的系统调用是38号rename,首先修改menu目录下的test.c文件,添加Rename函数,并在main里menuconfig方法里调用,如下图所示:

    在进行make rootfs后,在qemu中的执行效果如下:

    后打开gdb,在gdb中调试,在start_kernel和rename的系统调用入口sys_rename两个地方设置断点,执行效果如下图所示:

    在menuOS中执行rename指令后,断点停在sys_rename系统调用入口处,如下图所示:

对system_call的流程理解见上部分流程图所示。

总结

本周实验是了解系统调用在内核代码中的处理过程,实验实践起来会比较容易,但真正了解其在内核代码中的处理过程是十分困难的,在gdb环境下有些特殊的汇编代码还无法跟踪调试。使用 ALD(Assembly Language Debugger)这个汇编代码调试器可以完成汇编代码的调试,这会在以后进行实现。总统来说,进行本实验之后对system_call的关键流程有了清晰的了解,具体的细节指令还有待研究。
本周的实验遇到一个路径问题。在LinuxKernel/menu目录下直接执行init可执行文件,在menuOS下执行rename指令,发现指令返回提示成功,并成功更改文件名,如下图所示:

后把文件名更改回原文件名,在qemu环境下启动内核和menuOS,执行rename指令,指令返回error,并未成功更改文件名,如下图所示:

翻看rename函数源代码,判断应该是文件的路径问题,源码中使用的是相对路径,更改文件路径为绝对路径依然不能成功更改文件名。就非常疑惑,qemu环境下运行menuOS默认的相对路径到底在什么位置?
与同学讨论,大多也遇到了这个问题。本来想使用mkdir系统调用指令来生成文件,后在shell中使用find指令查找此文件夹,但是遇到了访问路径权限不足的问题,升级到root权限也无济于事。。。根据多个系统调用指令实验初步猜想,qemu环境没有默认的路径,其直接从内存中读写文件。这只是猜想,还望了解此问题的同学、老师看到此博可以给予指导解答。

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

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

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

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

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

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

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

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

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

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

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

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

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

  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. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

随机推荐

  1. Springboot解决war包放到Tomcat服务器上404的特殊情况

    Springboot解决war包放到Tomcat服务器上404的特殊情况 原文链接:https://www.cnblogs.com/blog5277/p/9330577.html 原文作者:博客园-- ...

  2. Promise 异步函数的加上外壳终止Promise

    //promise异步函数的请求终止 export default function markCancleble(promise){ let hasCanceled_ = false ; const ...

  3. python tar 打包

    import os import tarfile def make_targz_one_by_one(output_filename, source_dir): tar = tarfile.open( ...

  4. Redhat中关于httpd仓库安装的简要步骤

    创建repo-server: yum install httpd yum  install  httpd  -y       < -y 表示在安装过程中与界面交互时自动答复yes >sys ...

  5. [shell] 脚本使用 【记录】

    1.nginx日志切割 vi /var/log/nginx/cut_nginx_log.sh #!/bin/bash date=$(date +%F -d -1day) cd /var/log/ngi ...

  6. @RequestBody注解的参数仅仅读取一次的问题解决。

    最近在写日志管理,想着使用拦截器加注解的方式,但是遇到了一个问题,就是如果使用@RequestBody注解接收的参数只能读取一次,造成了我在拦截器中如果接收了参数,在Controller层就接收不到了 ...

  7. 字节顺序标记——BOM,Byte Order Mark

    定义 BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码.     介绍 UTF-8 不需要 BOM,尽管 Unico ...

  8. hello2源代码解析

    String username = request.getParameter("username");/**以 String 形式返回请求参数"username" ...

  9. Php基本类型——布尔类型

    1)简介 布尔类型,这是最简单的类型,bollean表达了真值,可以为true或false,它是php4引进的. 2)语法 要指定一个布尔值,使用关键字true或false,两个都不区分大小写. &l ...

  10. Mac系统下安装PyCharm

    首先,进入 PyCharm 的官网,https://www.jetbrains.com/pycharm/ 有macOS.Windows.Linux三个系统的自由选择,这里我们选macOS,然后down ...