1

我目前正在尝试从 UNIX 操作系统中获取一些版本的函数 idle() 工作。我有源代码,但我不擅长汇编语言(我最近一直在尝试改变)。有人可以帮助我更好地了解它的工作原理吗?

我试过搜索它,但没有任何有用的东西出现。我还查阅了《Lion's Commentary on UNIX》一书,但没有找到任何解释。

这是函数源代码,也是完整源代码的链接。

.globl  _idle
_idle:
    mov PS,-(sp)
    bic $340,PS
    wait
    mov (sp)+,PS
    rts pc

4

1 回答 1

3

嗯,这是手册中定义的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)and应该被(sp)+理解为等价于C/C++运算符--spand sp++

因此,它有效地保存状态,清除优先级位,然后等待中断。一旦中断到达,它就会恢复状态并重新开始工作。

PS寄存器内容的定义请参见手册中的【2.3.2处理器状态字】部分。

现在,由于wait各种原因,操作会被中断,其中最重要的是实时时钟中断,所以它会定期唤醒以做更多的工作。

当您查看源代码时,有两个地方idle()调用了例程 - 一个来自恐慌处理程序,在无限循环中,另一个在swtch.闲置的例行公事。

于 2019-07-30T14:03:57.587 回答