初始化变量时模式位是否改变?

时间:2015-02-22 09:44:56

标签: operating-system kernel system-calls

所以我知道系统调用(例如open, close, read, write等)将模式位改变两次 - 从用户模式到内核模式以提供系统调用请求,然后在完成后返回用户模式。

但如果我们有例如

int a = open("lol.txt", O_RDONLY);

模式位将再次更改两次以提供open系统调用,但是什么时候将它分配给变量?假设它需要将变量存储到内存中,我们是否必须返回内核再次提供该请求?即模式位在上一行中是否改变2或4次?

1 个答案:

答案 0 :(得分:2)

存在严重过度简化的风险,进入内核模式的唯一方法是异常(陷阱或故障)或中断。

对于系统调用,应用程序需要触发陷阱。总是,系统调用具有一个包装函数,可能会进行一些验证,将参数加载到适当的寄存器中(可能从中设置堆栈)。然后它执行一个导致陷阱的指令

     TRAP   #100 ; call the 100th exception handler

之后,处理器进入内核模式。将验证参数然后执行内核服务。完成后,它将使用以下行的插入返回:

   REI ; return from exception or interrupt

处理器返回用户模式。

open()可能是也可能不是实际的系统服务。也就是说,我刚才描述的包装之一。这取决于系统。 open()可能是一个调用多个系统服务的库函数,在这种情况下,处理器将进入内核模式并多次返回。

如果open()是系统服务,那么你可能只进入内核模式并返回一次。

open函数,无论是否是系统服务,都将返回寄存器中的值。存储该值是一个简单的移动指令。