系统调用

来源:互联网 发布:淘宝买家2钻厉害吗 编辑:程序博客网 时间:2024/06/14 09:26

本次实验的主要内容就是实现系统调用,了解系统调用的实现方式!
系统调用:是操作系统为用户态进程与硬件设备进行交互提供的一组接口,系统调用通过软中断向内核发送一个明确的请求,一般每个系统调用对应一个封装例程,库在用这些例程定义出给用户的API
API:API俗称应用编程接口(application program interface),只是一个函数定义
Linux系统调用需要三个步骤:
(1) 调用包含系统调用的API
(2)每个系统调用对应一个中断向量,执行中断向量system_call
(3)中断服务程序执行
system_call:system_call是linux中所有系统调用的入口点,每个系统调用至少有一个参数,即由eax传递系统调用号

下面实现用c代码实现20号getpid系统调用:
这里写图片描述
这里写图片描述

代码:

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

接下来是用汇编实现的同一功能代码:
这里写图片描述
这里写图片描述

对于嵌入式汇编语句实现的详解:

__asm__ volatile(        "movl $0,%%ebx\n\t"   //将ebx清0        "movl $0x14,%%eax\n\t"   //将20号系统调用参数传递给eax        "int $0x80\n\t"  //执行system_call        "movl %%eax,%0\n\t"  //将eax的值传递给pid        :"=m"(pid)            );

总结:当用户态通过int 0x80调用一个系统调用时,会进入中断程序。中断程序会SAVE_ALL,保存用户态进程(保存用户态栈顶地址,当时的状态字,当时的cs:eip的值),通过系统调用号决定调用哪个系统调用,系统调用号保存在eax中(也可以传递参数,但是参数不能超过6,超过6个会会把某个寄存器作为指针传入)。进入内核态,中断服务完成,系统调用会返回调用结果到eax寄存器。

陈思宇 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

0 0