• system_call的处理过程


    二. 系统调用在内核代码中的处理过程

    1.系统调用在内核代码中的工作机制和初始化

    整个系统调用过程中,时间很重要。
    以system_call为例,int 0x80指令与sys_call是通过中断向量联系起来的,而API和对应的sys是通过系统调用号联系起来的

    用户态时,系统调用xyz()使用int 0x80,它对应调用system_call

    右边的处理过程(汇编代码)非常重要,通过系统调用号匹配起来

    2.系统调用机制的初始化

    trap_init函数里面有一个set_system_trap_gate函数,其中涉及到了系统调用的中断向量SYSCALL_VECTOR和汇编代码入口system_call,一旦执行int 0x80,CPU直接跳转到system_call来执行。

    3.简化后便于理解的system_call伪代码

    1. systemcall的位置就在ENTRY(systemcall)处,其他中断的处理过程与此类似。

    • SAVE_ALL:保存现场

    • call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,是实际的系统调度程序。
      • sys_call_table:系统调用分派表
    • syscall_after_all:保存返回值

    • 若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。
      • work_pending -> work_notifysig,用来处理信号
        • 可能call schedule:进程调度代码
        • 可能跳转到restore_all,恢复现场。
    • 若无sys_exit_work,就执行restore_all恢复,返回用户态。

    • INTERRUPT_RETURN <=> iret,结束。



    伪代码简化了下

    SAVE_ALL与sys_call_table系统调用分派表,对应的处理函数分别是:

    sys_call_table(,%eax,4)

    JMP(EAX*4 + system_xxx)

    1.在系统调用返回之前,可能发生进程调度,进程调度里就会出现进程上下文的切换
    2.进程间通信可能有信号需要处理

    4.简单浏览system_call到iret之间的主要代码

    1. SAVE_ALL:保存现场
    2. syscall_call:调用了系统调用处理函数
    3. restore all:恢复现场(因为系统调用处理函数也算是一种特殊的“中断”)
    4. syscallexitwork:如3.中所述
    5. INTERRUPT RETURN:也就是iret,系统调用到此结束

    三.system_call到iret过程流程图

    等会看下视频补张图

    三、总结

    (一)从系统调用处理过程到一般的中断处理过程

    1. 保存现场

    • 在系统调用时,用SAVE_ALL来保存系统调用时的上下文。
    • 中断处理的第一步也是要保存中断程序现场。
    • 中断处理完之后,可以返回到原来被中断的地方,在原有的运行环境下继续正确的执行下去。

    2. 确定中断信息

    • 在系统调用中,需要将系统调用号通过eax传入,通过sys_call_table查询到调用的系统调用,然后跳转到相应的程序进行处理。
    • 中断处理时系统也需要有一个中断号,通过检索中断向量表,了解中断的类型和设备。

    3. 处理中断

    • 跳转到相应的中断处理程序后,对中断进行处理。

    4. 返回

    • 系统调用时最后要restore_all恢复系统调用时的现场,并用iret返回用户态。
    • 同样,执行完中断处理程序,内核也要执行特定指令序列,恢复中断时现场,并使得进程回到用户态。

    https://www.cnblogs.com/gaocan/p/5329221.html

  • 相关阅读:
    Dungeon Master (BFS与DFS的应用)
    Broken Keyboard(模拟数组或者双重链表的运用)
    自己设置的纸牌游戏(简单数组栈和队列的设计)
    贪吃蛇(双重优先队列的综合运用)
    N!的阶乘附带简单大整数类的输入输出(暂时没有深入的了解)
    大整数乘法(Comba 乘法 (Comba  Multiplication)原理)
    建筑抢修(堆优先队列和贪心的结合)
    lower_bound()函数与quicksort()函数的简单掌握
    Long Jumps(二分查找lower_bound()函数的运用)
    团队队列(列和map结合的经典运用)
  • 原文地址:https://www.cnblogs.com/feng9exe/p/12521377.html
Copyright © 2020-2023  润新知