linux系统调用--time调用以及汇编实现

56 阅读2分钟

linux系统调用

前置知识

linux系统为了保证系统的安全,确保一些核心的代码文件不会被更改,将系统的状态分为了用户态和内核态,用户态访问资源受限制,而内核态则可以访问任何资源,从而确保核心资源不会被用户态更改。

而系统还为用户提供系统调用,他们提供了与硬件设备等进行交互的接口。我们这里将要使用的就是系统调用。在系统调用的过程中,一开始处于用户态,当执行系统服务的时候会转为内核态,执行完成拿到结果之后会返回用户态。

简系统调用的执行过程:在用户态下执行某个API函数,在API函数中有一个int 0x80的中断向量,触发后,由用户态进入内核态,保存现场,查找system_ call表找到相应的系统调用号,找到后执行相应的系统调用服务例程,执行过后返回,恢复现场,回到用户态。 --《Linux内核分析》 mooc.study.163.com/course/USTC…

time系统调用

代码如下(1.c):

#include <stdio.h>
#include <time.h>
int main()
{
    time_t tt;
    struct tm *t;
    tt = time(NULL);  // time系统调用返回当前系统时间
    t = localtime(&tt);
    printf("time:%d:%d:%d:%d:%d:%d:\n", t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
    return 0;
}

编译执行即可得到结果

    gcc 1.c -o 1.out
    ./1.out

结果如下:

image.png 同时这里的获取系统时间还可以通过内嵌汇编代码来实现(2.c):

#include <stdio.h>
#include <time.h>
int main()
{
    time_t tt;
    struct tm *t;
    // tt = time(NULL);
    asm volatile(
        "mov $0,%%ebx\n\t"
        "mov $0xd,%%eax\n\t"
        "int $0x80\n\t"
        "mov %%eax,%0\n\t"
        : "=m"(tt));
    t = localtime(&tt);
    printf("time:%d:%d:%d:%d:%d:%d:\n", t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
    return 0;
}

编译时需要规定32为编译

gcc 2.c -m32 -o 2.out
./2.out

注意:这里使用不使用m32编译得到的不是正确的时间,而在使用-m32之后可能会报错: /usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory #include <gnu/stubs-32.h>`

这是需要安装一下资源

 yum install glibc-devel.i686 libstdc++-devel.i686

安装,y即可再次编译。 得到结果如下:

image.png

总结

一些系统调用(system_call)会短暂的进入到内核态执行,使用的栈也是内核栈,执行完成之后切换回用户态。

结语

本次的文章到这里就结束啦!♥♥♥读者大大们认为写的不错的话点个赞再走哦 ♥♥♥

每天一个知识点,每天都在进步!♥♥