所以我知道系统调用(例如open, close, read, write
等)将模式位改变两次 - 从用户模式到内核模式以提供系统调用请求,然后在完成后返回用户模式。
但如果我们有例如
int a = open("lol.txt", O_RDONLY);
模式位将再次更改两次以提供open
系统调用,但是什么时候将它分配给变量?假设它需要将变量存储到内存中,我们是否必须返回内核再次提供该请求?即模式位在上一行中是否改变2或4次?
答案 0 :(得分:2)
存在严重过度简化的风险,进入内核模式的唯一方法是异常(陷阱或故障)或中断。
对于系统调用,应用程序需要触发陷阱。总是,系统调用具有一个包装函数,可能会进行一些验证,将参数加载到适当的寄存器中(可能从中设置堆栈)。然后它执行一个导致陷阱的指令
TRAP #100 ; call the 100th exception handler
之后,处理器进入内核模式。将验证参数然后执行内核服务。完成后,它将使用以下行的插入返回:
REI ; return from exception or interrupt
处理器返回用户模式。
open()可能是也可能不是实际的系统服务。也就是说,我刚才描述的包装之一。这取决于系统。 open()可能是一个调用多个系统服务的库函数,在这种情况下,处理器将进入内核模式并多次返回。
如果open()是系统服务,那么你可能只进入内核模式并返回一次。
open函数,无论是否是系统服务,都将返回寄存器中的值。存储该值是一个简单的移动指令。