orange's学习--第六章:系统调用lm

本文深入探讨了操作系统中系统调用的机制,解释了应用程序如何通过系统调用与操作系统交互,以执行受限的操作,如获取系统ticks。通过具体的汇编语言和C语言代码示例,详细展示了系统调用的过程,包括软中断的触发、中断处理程序的设置以及不同系统调用的分发。

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

在我们的操作系统中,已经存在的3个进程是运行在ring1上的,它们已经不能任意地使用某些指令,不能访问某些权限更高的内存区域,但如果一项任务需要这些使用指令或者内存区域时,该怎么办呢?这时候只能通过系统调用来实现,它是应用程序和操作系统之间的桥梁。 

换句话说,应用程序的能力是有限的,很多事情做不了,只能交给操作系统来做。系统调用就是告诉操作系统: “我有一件事,请你来帮我来完成。” 

所以,一件事情就可能是应用程序做一部分,操作系统做一部分。这样,问题就又涉及特权级变换。

 

现在,假设进程P想得到当前的ticks,就问操作系统: “OS先生,请问当前的ticks是多少?”然后OS先生低头在 自己的记录本中查找了一下,然后告诉P: “当前的ticks是1234。” 

系统调用,使用汇编语言编写调用int软中断,syscall.asm

get_ticks:
    mov    eax, _NR_get_ticks
    int    INT_VECTOR_SYS_CALL
    ret

设置中断处理程序,同一个中断不同功能的eax对应不同的处理函数,也是使用汇编语言编写

    init_idt_desc(INT_VECTOR_SYS_CALL,    DA_386IGate,  sys_call,            PRIVILEGE_USER);

; =====================================================
;                                 sys_call
; =====================================================
sys_call:
        call    save

        sti

        call    [sys_call_table + eax * 4]
        mov     [esi + EAXREG - P_STACKBASE], eax      //C语言使用eax保存返回值

        cli

        ret

//不同的处理函数设置为数组的不同元素

PUBLIC    system_call        sys_call_table[NR_SYS_CALL] = {sys_get_ticks};

不同的处理函数使用C语言编写:

/*===========================================================*
                           sys_get_ticks
 *===========================================================*/
PUBLIC int sys_get_ticks()
{
    return ticks;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值