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

系统调用的三层机制

API:第一层是指Libc中定义的API,这些API封装了系统调用,使用int 0x80触发一个系统调用中断;当然,并非所有的API都使用了系统调用,如完成数学加减运算的API就没有使用系统调用;也有可能某个API使用了多个系统调用;这一层存在的价值就是为应用程序员提供易于使用的API来调用系统调用;

system_call:运行于内核态。system_call是所有系统调用在内核的入口点,在其中的开始处保护用户态程序执行上下文,结束处恢复用户态程序执行上下文,在中间根据传入的系统调用号对应的中断服务程序;

sys_xyz 系统调用封装例程:执行具体的系统调用操作,完成用户的系统调用请求;每个系统调用都对应一个封装例程;

用户态、内核态和中断处理过程

一般现代CPU都有几种不同的指令级别,在高执行级别下,代码可以执行特权指令,访问任意物理地址,这种CPU执行级别就对应着内核态。Intel x86 cpu 有四种不同的执行级别0-3,Linux只使用了其中的0级和3级,分别来表示内核态(0级)和用户态(3级)。
中断处理是从用户态进入内核态的主要方式。
系统调用只是一种特殊的中断。

实验过程

使用c的c代码,可以返回当前的进程号

 #include <stdio.h>
     #include <unistd.h>
 int main(){
 pid_t pid;
 pid=getppid();
 printf("The process number is %d\n",pid);
return 0;
}

转为汇编代码的结果如下

#include<stdio.h>
#include<unistd.h>

int main(){
pid_t pid;
asm volatile(
"mov $0,%%ebx\n\t"
"mov $0x40,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(pid)
);

printf("the process number is %d\n",pid);
return 0;
}

执行结果如下:

猜你喜欢

转载自www.cnblogs.com/besti-20199303/p/11708558.html