linux内核分析第四次实验
实验步骤:
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用。本次实验中我使用第20号系统调用getpid()函数,用于取得进程识别码。
-
C代码(getpid.c):
#include <unistd.h> #include <stdio.h> int main() { pid_t pid; pid = getpid(); printf("pid = %d \n",pid); return 0; }
- 编译及运行结果见下图:
-
嵌入汇编代码getpid_asm.c:
#include <unistd.h> #include <stdio.h> int main() { pid_t pid; pid = getpid(); asm volatile( "mov $0,%%ebx\n\t" //系统调用传递第一个参数使用ebx,因为这里没有传入参数所以是null "mov $0x14,%%eax\n\t" //使用%eax传递系统调用号20,用16进制表示为0x14 "int $0x80\n\t" //执行系统调用 "mov %%eax,%0\n\t" //将%0(即pid的返回值)放到%eax寄存器中 : "=m" (pid) ); printf("pid = %d \n",pid); return 0; }
- 编译及运行结果见下图:
实验总结:
系统调用是操作系统为用户态进程与硬件设备进行交互提供的一组接口,也是一种特殊的中断,可使用户态切换到内核态。当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。