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

本文介绍了CPU的工作状态包括内核态与用户态,并详细解释了如何通过系统API和直接使用系统调用来获取当前时间。此外,还展示了具体的C语言和汇编语言示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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) 

“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值