系统调用 - 该指令生成一个导致OS获得的中断 控制处理器。
因此,如果正在运行的进程发出系统调用(例如,创建/终止/读/写等),则会产生一个中断,该中断会导致KERNEL对控制器进行控制,然后处理器执行所需的中断处理程序。正确的吗?
那么任何人都可以告诉我处理器如何知道该指令应该阻止进程,进入特权模式并带来内核代码。
我的意思是作为程序员,我只需输入stream1 = system.io.readfile(ABC)或其他东西,转换为打开和读取文件ABC。
现在监控这个过程执行的是什么,cpu中有一个神奇的力量来检测它?
从我读过的内容来看,一个处理器一次只能执行一个进程,那么监视程序运行在哪里?
如果在不运行状态时进行系统调用,KERNEL如何监控系统调用!!
或计算机是否有一个系统调用指令表,它在执行任何指令之前与之比较?
请帮助
thanku
答案 0 :(得分:7)
内核不监视检测系统调用的进程。相反,该过程会生成一个中断,将控制转移到内核,因为这是软件生成的中断根据指令集参考手册所做的事情。
例如,在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
答案 1 :(得分:2)
让我们分析您提出的每个问题。
是的,您的理解是正确的。
看看,如果任何进程/线程想要进入内核,那么只有两种机制,一种是通过执行TRAP机器指令而另一种是通过中断。通常中断是由硬件生成的,因此任何其他进程/线程都希望进入内核它通过TRAP。因此,通常当进程执行TRAP时,它会向内核发出中断(主要是软件中断)。除了陷阱,您还会提到系统调用号,这将作为内核中断处理程序的输入。根据系统调用号,您的内核在系统调用表中找到系统调用函数,并开始执行该函数。一旦内核开始处理中断以接近处理器,内核将设置cs寄存器内的模式位,因为当前指令是特权指令。通过这个,您的处理器将知道当前指令是否具有特权。一旦你的系统调用函数完成它的执行,你的内核就会执行IRET指令。这将清除CS寄存器中的模式位,以通知来自现在的任何指令来自用户模式。
处理器内部没有神奇的力量,用户和内核上下文之间的切换使我们认为处理器是一个神奇的东西。它只是一块能够以很高的速率执行大量指令的硬件。
4..5..6。上述案例回答了所有这些问题。
我希望我在某种程度上回答了你的问题。
答案 2 :(得分:0)
中断控制器向CPU发出中断已发生的信号,通过中断号(因为中断被指定优先级以处理同时中断)因此中断号确定要启动的处理程序。 CPu跳转到中断处理程序,当中断完成后,程序状态重新加载并恢复。
[参考:Silberchatz,操作系统概念第8版]
答案 3 :(得分:0)
您要寻找的是mode bit
。基本上有一个名为cs register
的寄存器。通常,其值设置为3(用户模式)。对于特权指令,内核将其值设置为0。通过查看该值,处理器可以知道它是哪种指令。如果您有兴趣进一步挖掘,请参阅此excellent article。
其他参考
答案 4 :(得分:-1)
现代硬件支持多个用户会话。如果您的hw支持多用户模式,我提供了一种称为中断的机制。中断基本上停止执行当前代码以执行其他代码(例如内核代码)。 执行哪个代码由参数决定,这些参数通过发出中断的代码传递给中断。 hw将增加运行级别,将内核代码加载到内存中并强制cpu执行此代码。当内核代码返回时,它再次直接通知hw并且运行级别降低。 然后,HW将在中断之前恢复cpu状态,并将cpu设置为启动中断的代码中的下一行。完成。 由于代码主动调用hw,它再次主动调用内核,因此内核本身不需要进行任何监视。
旁注: 尽量保持简短的问题。弄清楚你想要什么。第一个答案对于您发布的问题是正确的,您只是没有说出来。明确表示您对该主题不熟悉,需要对基本概念进行详细说明,而不是解释您目前所理解的内容,并且不要使用大写锁定。
请接受cnicutar提供的答案。谢谢。