系统调用的工作机制

第一部分
使用库函数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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值