zoukankan      html  css  js  c++  java
  • 2018-2019-1 20189221《Linux内核原理与分析》第五周作业

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

    实验四

    实验过程

    1. 当用户态进程调用一个系统调用时,cpu切换到内核态并开始执行一个内核函数。
      在Linux中是通过int $0x80来执行系统调用的,这条汇编指令产生向量为128的编程异常
    • 传参:内核实现了很多不同的系统调用,进程必须指明需要哪个系统调用,这需要传递一个名为系统调用号的参数(使用eax寄存器)
    • 系统调用也需要输入输出参数,例如:实际的值、用户态进程地址空间的变量的地址、包含指向用户态函数的指针的数据结构的地址
    • system_call是Linux中所有系统调用的入口点,每个系统调用至少有一个参数,即由eax传递的系统调用号。

    一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

    编写API调用fpid

    编写嵌入汇编代码调用fpid

    编译执行结果如下:

    代码分析

    
    asm volatile (                            //进入嵌入式汇编,volatile表示禁止服务器优化
            "mov $0, %%ebx
    	"        // 由于fork函数调用不需要参数,可直接将立即数0赋值给ebx,代表NULL。没有这条语句应该也可以。
            "mov $0x2, %%eax
    	"    // 系统调用号默认通过eax传递,因此将fork的系统调用号0x2赋值给eax
            "int $0x80
    	"                  // 通过0x80中断向量,执行系统调用。系统由eax此时的值可知,用户请求fork调用。
            "mov %%eax, %0
    	"      // 系统返回的pid号默认储存在eax中,将eax的值赋给第一个输出操作数,即下面的fpid。
            : "=m" (fpid)                     // =代表操作数在指令中是只写的,m代表内存变量。即输出操作数0为内存中的fpid。
            );
    
  • 相关阅读:
    Asp.net MVC中 Controller 与 View之间的数据传递
    Asp.net中WebForm 与 MVC的架构区别
    初步理解MVC
    JavaScript 设置、读取Cookie
    JavaScript 设计模式之工厂模式
    JavaScript对象 属性
    JavaScript中对于闭包的理解
    WebApi 实例
    webservice 简单实例
    【转】Linq 语法
  • 原文地址:https://www.cnblogs.com/gdman/p/9919807.html
Copyright © 2011-2022 走看看