甜死人的图片

一、书本第四章知识总结【系统调用的三层机制(上)】

  • 无参数系统调用
    依次通过c语言和内嵌汇编的c语言实现time()函数中封装的系统调用。
  • 用户态、内核态和中断
    • 用户态:在低的执行级别下,代码能够掌控的范围有所限制,只能访问部分内存。
      -内核态:在高的执行级别下,代码可以执行特权指令,访问任意的物理内存。
      -中断:从用户态进入内核态的主要方式。
      -中断类别

      • 硬件中断:在用户态进程执行时,硬件中断信号到来,进入内核态,就会执行这个中断对应的中断服务例程。
      • 软中断:在用户态进程执行过程中,调用了一个系统调用(一种特殊中断),进入内核态。
  • 寄存器上下文切换
    当用户态切换到内核态时,就要把用户态寄存器上下文保存起来,同时把内核态的寄存器的值放到当前CPU中。
    int指令触发中断机制会在堆栈上保存一些寄存器的值,会保存用户态栈顶地址、当时的状态字、当时的CS:EIP的值。
    同时会将内核态的栈顶地址、内核态的状态字放入CPU对应的寄存器,并且CS:EIP寄存器的值会指向中断处理程序的
    入口,对于系统调用来说是指向system_call。int指令或中断信号发生之后,第一件事就是保存现场,进入中断处理程
    序,执行SAVE_ALL。中断处理程序结束后,中断处理结束前的最后一件事是恢复现场,执行RESTORE_ALL。
  • API和系统调用关系
    • API:应用程序编程接口,只是函数定义。
    • 系统调用:是通过软中断向内核发出了中断请求,int指令的执行就会触发一个中断请求。
      libc函数库定义的一些API内部使用了系统调用的封装例程,其主要目的是发布系统调用,使程序员在写代码时不需要
      用汇编指令和寄存器传递参数来触发系统调用。一个API可能只对应一个系统调用,亦可能内部由多个系统调用实现,
      一个系统调用也可能被多个API调用。
    • Intel x86 CPU定义了4种不同的执行级别0、1、2、3,数字越小特权越高。Linux系统采用了其中的0、3两个特权级别。
  • 寄存器相关知识点
    • 系统调用通过系统调用号进行区分,通过EAX寄存器传递。
    • 普通函数调用是通过将参数压栈的方式传递的,而系统调用因为在用户态和内核态下使用不同的堆栈,无法通过参数压
      栈的方式进行传递,而是通过比较特殊的寄存器传递参数的方式进行。
    • 参数按照顺序赋值给EBX、ECX、EDX、ESI、EDI、EBP,参数的个数不能超过6个,否则的话全部参数应该依次放在
      一块连续的内存区域里,同时在寄存器EBX中保存指向该内存区域的指针。

二、实验部分【使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用】

(1)代码(系统调用write)

int write(int fd,const char *buf, off_t count)//fd为文件描述符,buf为写缓冲区指针,count为写入字节数

#include<stdio.h>
int main()
{
    char* c = "this is sys_write";
    write(0,c,18);
    return 0;
}

(2)嵌入汇编代码调用系统调用


include<stdio.h>
int main()
{
    char* c = "this is sys_write";
    asm volatile (
        "mov $0,%%ebx\n\t"//对应fd
        "mov %0,%%ecx\n\t"//对应buf,也就是c
        "mov $18,%%edx\n\t"//对应count
        "mov $0x4,%%eax\n\t"//系统调用号为4
        "int $0x80\n\t"
        :
        :"r"(c)
    );
    return 0;
}
或
int main()
{
    char* c="this is sys_write";
    asm volatile(
        "mov $0,%%ebx\n\t"//对应fd
        "mov $18,%%edx\n\t"//对应count
        "mov $0x4,%%eax\n\t"//系统调用号为4
        "int $0x80\n\t"
        :
        :"c"(c)//直接将输入存入ecx
}

三、实验收获

1. 小总结

这一节主要通过实验,了解了系统如何进行系统调用的,加深了对内核态和用户态的理解。操作系统平常工作都在
用户态当中,当用户态需要操作一些内核数据时,才会通过系统调用进入内核态,而这些系统调用都是操作系统本
身实现了,用户无法修改。可以看出通过这种方式,操作系统实现了对关键数据的保护,从而维护了系统的高效稳定运行。

2. link分为两种类型:

  • 硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,
    称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用
    是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对
    应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,
    文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
  • 另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特
    殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

2018-2019-1 20189201 《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. mysql日志分析工具之mysqlsla

    背景介绍: 很多情况下,都需要对MySQL日志进行各种分析,来了解系统运行的方方面面.MySQL官方自带了一些工具对日志进行分析,比如mysqlbinlog可以用来分析二进制日志,mysqlslow可 ...

  2. Js中常用知识点(typeof、instanceof、动态属性、变量作用域)

    1.Js中各类型的常量表示形式:Number:number     String:string    Object:objec 2.typeof运算符在Js中的使用:用于判断某一对象是何种类型,返回值 ...

  3. Vue(二)简单入门

    根据上一节搭建的hello-world工程(包含Router),用Webstorm打开,我们先运行一下工程. 界面如下 .. 我将在About里面介绍一下Vue的相关内容. 打开About.vue,修 ...

  4. python6-深浅拷贝 元组类型 字典类型 集合类型

    一,深浅拷贝 (一) 值拷贝:应用场景最多 案例:1.ls = [1, 'abc', [10]]    ls1 = ls     # :ls1直接将ls中存放的地址拿过来#  :    ls内部的值发 ...

  5. java matlab 混合编程 Failed to find the required library mclmcrrt9_2.dll on java.library.path.

    问题描述: Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the requir ...

  6. 第十四节:再探MVC中路由的奥秘

    一. 基于RouteBase扩展 1. 原理 扩展RouteBase,同样使用的是MVC框架提供的MvcRouteHandler进行处理. 2. 步骤 1. 新建YpfRoute1类,继承RouteB ...

  7. ArcMap修改粘滞移动容差防止要素在选择时无意拖动移动

    粘滞移动容差将设置一个最小像素数,鼠标指针必须在屏幕上移动了此最小距离时,所选要素才会实际发生移动. 设置粘滞移动容差的结果是延迟移动所选要素,直到指针至少移动了这段距离.此方法可用于在使用“编辑”工 ...

  8. JaVa第二周学习总结

    第一周学习的时候上传图片用的是网站外链然后导致出现了极为尴尬的情形...然后我就把第一周的全改成本地上传了. 首先列出所做任务 1 安装IDEA 2学习二三章视频,课本 3调试代码,上传码云 4总结问 ...

  9. [物理学与PDEs]第3章第2节 磁流体力学方程组 2.4 不可压情形的磁流体力学方程组

    不可压情形的磁流体力学方程组 $$\beex \bea \cfrac{\rd {\bf H}}{\rd t}-({\bf H}\cdot\n){\bf u}&=\cfrac{1}{\sigma ...

  10. HTML常用知识点代码演示

    1 HTML部分常用知识点 <!-- 版本声明 --> <!DOCTYPE html> <!-- 唯一根元素 --> <html> <!-- 对网 ...