系统调用的工作机制

来源:互联网 发布:流量统计软件 编辑:程序博客网 时间:2024/06/05 15:27

第一部分
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
图1 39号系统调用
这里写图片描述
mkdir函数使用的是39号系统调用,作用是创建一个新的目录。int mkdir(const char *pathname, mode_t mode)有两个参数,一个是目录的名字,另外一个参数是创建目录的权限。这里使用的mode_t值使用S_IRWXU(具有读写执行权限),函数返回一个整形变量。

使用库函数API使用mkdir这个系统调用

#include <stdio.h>#include <sys/stat.h>int main(){    mkdir("new_dir",S_IRWXU);    return 0;}

图2 API实验效果
这里写图片描述
按照指定的的权限创建了一个新的new_dir目录
使用C代码中嵌入汇编代码使用mkdir这个系统调用

#include <stdio.h>#include <sys/stat.h>int main(){    char *dirName = "new_dirAsm";    mode_t mode = S_IRWXU;    int return_Value = 0;    asm volatile        (                   "movl $39,%%eax\r\n"  /*使用eax传递39号系统调用号*/        "movl %1,%%ebx\r\n"   /*将第一个参数文件名的地址存入ebx寄存器中*/        "movl %2,%%ecx\r\n"   /*将第二个参数文件权限存入ecx寄存器中*/        "int $0x80\r\n"       /*执行$0x80中断进入内核态*/        "movl %%eax, %0"      /*最后将返回值放入retrun_Value中*/        :"=m"(return_Value)           :"d"(dirName),"D"(mode)         );    printf("%d\n",return_Value);    return 0; }

图3 C代码中嵌入汇编代码实验效果
这里写图片描述
按照指定的的权限创建了一个新的new_dirAsm目录

第二部分
API:应用程序接口是一个函数定义,系统调用通过软中断向内核发出一个明确的请求。
系统调用:操作系统为用户态进程与硬件设备进行交互提供了一组接口。
当API中包含系统调用时,通过系统调用号进入相应的系统调用,然后使用软中断进入内核态。中断发生后会保护现场,将用户的当前栈顶地址,当时的状态字和cs:eip的值进行压栈。之后进入由用户态切换到内核态,处理完中断程序后还原现场,返回用户态。
通过使用API和C代码中嵌入式汇编代码两种方式实现系统调用,理解了系统调用的工作过程。

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

0 0
原创粉丝点击