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
结果如下:
同时这里的获取系统时间还可以通过内嵌汇编代码来实现(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即可再次编译。 得到结果如下:
总结
一些系统调用(system_call)会短暂的进入到内核态执行,使用的栈也是内核栈,执行完成之后切换回用户态。
结语
本次的文章到这里就结束啦!♥♥♥读者大大们认为写的不错的话点个赞再走哦 ♥♥♥
每天一个知识点,每天都在进步!♥♥