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

CPU工作状态分为内核态与用户态,他们的执行的指令的权限不同,用户态程序不能访问0xb00000以后的的内存(虚拟内存)
系统内核会提供一些系统调用,它们执行一些底层的,有关硬件的功能,出于安全与兼容的考虑,用户态程序无法访问硬件,需要通过系统调用来实现一些功能,如获取当前事件,在屏幕上显示等。
操作系统提供了一些系统api以供程序调用,一个系统api可能调用多个系统调用,一个系统调用也可能有多个系统api使用。
我们在程序中可以调用系统api实现某些功能,也可以直接使用系统调用
调用api:

#include 

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) 

“`

你可能感兴趣的:(Linux内核分析实验4——系统调用)