【发布时间】:2015-04-23 18:06:24
【问题描述】:
所以我知道系统调用(例如open, close, read, write 等)会两次更改模式位 - 从用户模式到内核模式以服务系统调用请求,然后在完成后返回用户模式。
但是如果我们有例子
int a = open("lol.txt", O_RDONLY);
模式位将再次更改两次以服务于open 系统调用,但是将其分配给变量时呢?假设它需要将变量存储到内存中,我们是否必须返回内核再次处理该请求?即上述行中的模式位是否更改了 2 次或 4 次?
【问题讨论】:
-
@xmojmr 如果你阅读了这个问题,你会发现它不是。
-
我相信答案就在ABI 中,如果您使用编译器的选项来生成汇编源文件输出就会变得很清楚。答案是否,原因是系统调用通过寄存器和直接内存写入将它必须做的一切返回到用户模式。使用变量(本地、全局、易失性等)进行改组完全超出了系统调用的范围。
ABI指定将用作输入/输出通道的内容,并且局部变量不在列表中 -
@xmojmr 我知道它超出了系统调用的范围,但变量存储在内存中的某个地方——为此,我们必须切换到内核模式,或者至少这是我的假设。所以这就是我的问题 - 一旦我们打开文件并尝试将其保存到某个变量中,我们是否需要回到内核模式?
-
您的示例中的文件句柄是
int。它在一个寄存器中从内核返回。然后可以使用普通的“int b = a”C指令将这个简单的值保存在您想要的任何位置。这是单一的MOV 汇编指令。不需要内核模式来执行这类事情。您能否提供一个更复杂(或更实际)的示例,说明您认为切换到内核并返回可能存在问题的地方?
标签: operating-system kernel system-calls