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