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;
}
执行结果如下: