一.基础知识
1. 用户态,内核态和中断
计算机的硬件资源是有限的,为了减少有限资源的访问和使用冲突,CPU和操作系统必须提供一些机制对用户程序进行权限划分。现代的CPU一般都有几种不同的指令执行级别,就是什么样的程序执行什么样的指令是有权限的。
内核态:在高的执行级别下,代码可以执行特权指令,访问任意的物理内存,这时CPU的执行级别对应的就是内核态,对所有的指令包括特权指令都可以执行。
用户态:在用户态(低级别指令),代码能够掌控的范围会受限制。
中断: 中断处理是从用户态进入内核态的主要方式,系统调用也是一种中断。一般来说,进入内核态是由中断触发的,可能是硬件中断,在用户态进程执行时,硬件中断信号到来,进入内核态,就会执行这个中断对应的中断服务例程。也可能是用户态程序执行的过程中,调用了一个系统调用,陷入了内核态,叫做Trap(系统调用知识特殊的中断)。这时就会有从用户态到内核态的寄存器上下文的切换问题,当用户态切换到内核态时,就要吧用户态寄存器上下文保存起来,同时要把内核态的寄存器的值放在当前的CPU中。int指令也会触发中断机制。
2. 系统调用的功能和特性
系统调用具有以下功能和特性:
-
a、把用户从底层的硬件编程中解放出来。操作系统为我们管理硬件,用户态进程不用直接与硬件设备打交道。
-
b、极大地提高系统的安全性。如果用户态进程直接与硬件设备打交道,会产生安全隐患,可能引起系统崩溃。
-
c、使用户程序具有可移植性。用户程序与具体的硬件已经解耦合并。
二.实验内容
1.使用库函数API触发一个系统调用
在/LinuxKernel/linux-3.18.6/arch/x86/syscalls目录下查看getgid文件,获取系统调用号信息。
getgid在32位系统下系统调用号为47,即2f;
2.使用C 代码嵌入汇编代码触发一个系统实现调用
代码如下: