2019-2020-1 20199315《Linux内核原理与分析》第五周作业
《庖丁解牛Linux内核分析》第四章
系统调用的三层机制(上)
用户态、内核态和中断
系统调用在操作系统中的位置示意图:
Intelx86 CPU有4中不同的执行级别,分别是0、1、2、3,数字越小,特权越高。Linux操作系统中只是采用了其中的0和3两个特权级别,分别对应内核态和用户态。
用户态和内核态很显著的区分方法是CS:EIP的指向范围,内核态时,CS:EIP的值可以是任意的地址,在32位的x86机器中有4GB的进程地址空间,内核态下的这4GB的地址空间都可以访问;用户态下则只能访问0x00000000-0xbfffffff的地址空间。
系统调用也是一种中断,中断处理是从用户态进入内核态的主要方式。
系统调用概述
系统调用的意义是操作系统为用户态进程与硬件设备进行交互提供了一组接口。系统调用有以下功能和特性:
1.把用户从底层的硬件编程中解放出来
2.极大地提高系统的安全性
3.使用户程序具有可移植性
实验楼实验四
1.使用库函数API触发一个系统调用
C语言源代码:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(void)
{
int u_id;
u_id=getpid();
printf("u_id=%u\n",u_id);
return 0;
}
运行结果:
2.C代码中嵌入汇编代码出发一个系统调用
源代码如下:
#include<stdio.h>
#include<unistd.h>
int main(void)
{
int u_id;
asm volatile(
"movl $0x14,%%eax\n\t" /* 将系统调用号赋给eax寄存器 */
"int $0x80\n\t" /* 执行系统调用 */
"movl %%eax, %0\n\t" /* 将系统调用执行后的返回值赋给变量 */
:"=m" (u_id)
);
printf("u_id=%u\n",u_id);
return 0;
}
运行结果:
此为本人Linux学习第五周的内容,如有不足,还请批评指正,不胜感激。
以上