系统调用的三层机制(上)
一、用户态、内核态和中断
知识点:
1.intel x86 CPU有四种不同的执行级别,分别是0、1、2、3,数字越小,特权越高。
2.linux操作系统只是采用了0和3两个特权级别,分别对应内核态和用户态。
3.内核态可以访问所有的内存,而用户态只可以访问0x00000000-0xbfffffff之间的内存。
3.系统调用:操作系统为用户态进程与硬件设备进行交互提供了一组接口
二、系统调用
知识点:
1.什么是系统调用:
操作系统为用户态进程与硬件设备进行交互提供了一组接口
2.系统调用的意义:
-把用户从底层的硬件编程中解放出来
-极大的提高了系统的安全性
-使用户程序具有可移植性
3.API和系统调用是不同的,API只是一个函数定义,而系统调用通过软中断向内核发出一个明确的请求。
4.系统调用的3层机制:xyz、system_call和sys_xyz
第一层:API
第二层:中断向量对应的
第三层:系统调用有不同种类的服务程序
三、使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验步骤:
1.使用库函数API使用系统调用:
2.C代码中嵌入汇编代码使用系统调用:
用自己的实验环境时候,出现段错误提示,由于未找到错误原因,故在实验楼继续试验:
3.代码分析:
#include <stdio.h>
#include <unistd.h>
int main(void){
pid_t tt;
asm volatile(
"movl $0x14, %%eax
" //将系统调用号赋给eax寄存器
"int $0x80
" //执行系统调用
"movl %%eax, %0
" //将系统调用执行后的返回值赋给变量tt
:"=m"(tt)
);
printf("%u
",tt);
return 0;
}