我当前正在尝试从UNIX OS工作中获取函数IDLE((的某些版本。我有源代码,但是我对汇编语言不好(我最近一直在尝试更改(。有人可以帮助我更好地了解它的工作原理吗?
我已经尝试搜索它,但是没有什么有用的。我还检查了《狮子对Unix的评论》一书,但我没有找到任何解释。
这是功能的来源,这是完整源代码的链接。
.globl _idle
_idle:
mov PS,-(sp)
bic $340,PS
wait
mov (sp)+,PS
rts pc
好吧,这是PDP 11/40汇编语言,该语言在手册中定义。
让我们将其分解,排行:
.globl _idle # define a global symbol called idle
_idle: # this is the label for the global symbol
mov PS,-(sp) # push processor state onto stack
bic $340,PS # clear priority level bits - effectively enable all interrupts
wait # wait for an interrupt
mov (sp)+,PS # pop processor state from stack
rts pc # return from function
-(sp)
和(sp)+
应读取为C/C++
操作员--sp
和sp++
。
因此,它有效地保存了状态,清除了优先级级别位,然后等待中断。中断到达后,它将恢复状态并恢复工作。
请参阅手册中的[2.3.2处理器状态词]的部分,以定义PS寄存器的内容。
现在,出于多种原因,wait
操作将被中断,其中最重要的是实时时钟中断,因此它会定期唤醒以进行更多工作。
当您查看源时,在两个地方称为idle()
例程 - 一个来自恐慌处理程序,无限循环中的一个,而在swtch
中的下一个是在过程之间交换的,当它找不到。可运行的过程进入空闲例程。