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。
        );
原文地址:https://www.cnblogs.com/gdman/p/9919807.html