您的位置:首页 > 运维架构 > Linux

Linux内核分析实验4——系统调用

2017-03-12 23:03 232 查看
CPU工作状态分为内核态与用户态,他们的执行的指令的权限不同,用户态程序不能访问0xb00000以后的的内存(虚拟内存)

系统内核会提供一些系统调用,它们执行一些底层的,有关硬件的功能,出于安全与兼容的考虑,用户态程序无法访问硬件,需要通过系统调用来实现一些功能,如获取当前事件,在屏幕上显示等。

操作系统提供了一些系统api以供程序调用,一个系统api可能调用多个系统调用,一个系统调用也可能有多个系统api使用。

我们在程序中可以调用系统api实现某些功能,也可以直接使用系统调用

调用api:

#include <time.h>

int main()
{
time_t tt;
struct tm *t;
tt=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;
}


使用系统调用

time_t tt;
struct tm *t;
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;


使用系统调用,需要使用汇编,用法解释如下

“`

/*
设置ebx为0,ebx为系统调用的第一个参数,如果有第二个第三个参数,以此存放在ecx,edx,等通用寄存器中,若参数太多,最后一个存放多余参数的指针
*/
"mov $0,%%ebx\n\t"
/*
eax为系统调用号,即告诉系统要调用那个系统调用,0xd为获取当前时间
*/
"mov $0xd,%%eax\n\t"
/*
调用0x80中断,即开始系统调用
*/
"int $0x80\n\t"
/*
系统调用的结果会存放在eax中
*/
"mov %%eax,%0\n\t"
: "=m" (tt)


“`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐