首页 文章

处理器如何知道指令正在进行系统调用

提问于
浏览
3

系统调用 - 它是一条指令,它产生一个中断,使OS获得对处理器的控制 .

因此,如果正在运行的进程发出系统调用(例如创建/终止/读/写等),则会产生一个中断,该中断会导致处理器的KERNEL TAKE CONTROL,然后处理器执行所需的中断处理程序 . 正确?

然后任何人都可以告诉我处理器如何知道该指令应该阻止进程,进入特权模式,并带来内核代码 .

我的意思是作为程序员我只需键入stream1 = system.io.readfile(ABC)或其他东西,转换为打开和读取文件ABC .

现在监控这个过程执行的是什么,cpu中有一个神奇的力量来检测这个?

从我读过的内容来看,一个处理器一次只能执行一个进程,那么监视器程序运行在哪里?

如果在不运行状态下进行系统调用,KERNEL如何监控!

或计算机是否有一个系统调用指令表,它与执行任何指令之前进行比较?

请帮忙

感谢你

4 回答

  • 0

    内核不监视检测系统调用的进程 . 相反,该过程会生成一个中断,将控制转移到内核,因为这是软件生成的中断根据指令集参考手册执行的操作 .

    例如,在Unix上,进程填充 eax 中的系统调用号并运行 int 0x80 指令,该指令生成中断 0x80 . CPU通过查看Interrupt Descriptor Table来查找该中断的内核处理程序 . 此处理程序是系统调用的入口点 .

    因此,在32位x86 Linux中调用 _exit(0) (原始系统调用,而不是刷新缓冲区的glibc exit() 函数):

    movl  $1, %eax   # The system-call number.  __NR_exit is 1 for 32-bit
    xor   %ebx,%ebx  # put the arg (exit status) in ebx
    int   $0x80
    
  • 6

    让我们分析一下你提出的每个问题 .

    • 是的,您的理解是正确的 .

    • 看,如果任何进程/线程想要进入内核,那么只有两种机制,一种是通过执行TRAP机器指令而另一种是通过中断 . 通常中断是由硬件生成的,因此任何其他进程/线程都希望进入内核它通过TRAP . 因此,通常当进程执行TRAP时,它会向内核发出中断(主要是软件中断) . 除了陷阱,您还会提到系统调用号,这将作为内核中断处理程序的输入 . 根据系统调用号,您的内核在系统调用表中找到系统调用函数,并开始执行该函数 . 内核将在cs寄存器中设置模式位,一旦它开始处理中断以接近处理器,因为当前指令是特权指令 . 通过此,您的处理器将了解当前指令是否具有特权 . 一旦你的系统调用函数完成它的执行,你的内核就会执行IRET指令 . 这将清除CS寄存器内的模式位,以通知来自现在的任何指令都来自用户模式 .

    • 处理器内部没有神奇的力量,用户和内核上下文之间的切换使我们认为处理器是一个神奇的东西 . 它只是一块能够以很高的速率执行大量指令的硬件 .

    4..5..6 . 上述案例回答了所有这些问题的答案 .

    我希望我在某种程度上回答了你的问题 .

  • -1

    中断控制器向CPU发出中断已发生的信号,通过中断号(因为中断被指定优先级以处理同时中断),因此中断号确定要启动的处理程序 . CPu跳转到中断处理程序,当中断完成时,程序状态重新加载并恢复 .

    [参考:Silberchatz,操作系统概念第8版]

  • 2

    现代硬件支持多个用户会话 . 如果您的hw支持多用户模式,我提供了一种称为中断的机制 . 中断基本上停止执行当前代码以执行其他代码(例如内核代码) . 执行哪个代码由参数决定,这些参数通过发出中断的代码传递给中断 . hw将增加运行级别,将内核代码加载到内存中并强制cpu执行此代码 . 当内核代码返回时,它再次直接通知hw并且运行级别降低 . 然后,HW将在中断之前恢复cpu状态,并将cpu设置为启动中断的代码中的下一行 . 完成 . 由于代码主动调用hw,它再次主动调用内核,因此内核本身不需要进行监视 .

    附注:尽量保持简短的问题 . 弄清楚你想要什么 . 对于你发布的问题,第一个答案是正确的,你只是没有说出来 . 明确表示您对该主题不熟悉且需要详细说明解释基本概念而不是解释你到目前为止所理解的内容并且不使用大写锁定 .

    请接受提供的答案cnicutar . 谢谢 .

相关问题