+ -
当前位置:首页 → 问答吧 → 《Linux内核完全剖析-基于0.12内核》head.s中的疑问

《Linux内核完全剖析-基于0.12内核》head.s中的疑问

时间:2010-12-05

来源:互联网

在阅读《Linux内核完全剖析-基于0.12内核》中的第四章提供的多任务内核代码head.s的时候,有几处不明白的地方。希望高手能够帮我解惑:
1、在timer_interrupt中有如下代码:
Assembly code

    movl $1, %eax
    cmpl $eax, current
    je   1f
    movl %eax, current
    ljmp $TSS1_SEL, $0
    jmp  2f
1:  movl $0, current
    ljmp $TSS0_SEL, $0
2:  popl %eax
    pop  %ds
    iret


上面的jmp 2f似乎是一条无用的语句,始终不会执行。不知道是否正确?
2,在57行开始的地方有如下代码:
Assembly code

    pushl $0x17
    pushl $init_stack
    pushl
    pushl $0x0f
    pushl $task0
    iret


iret指令会弹出栈中的的数据来设置CS, EIP以及EFLAGS,即CS=$task0, EIP=0x0f,那么pushl $0x17;pushl $init_stack这两条入栈语句干什么用的啊,在task0,和task1中没有使用pop指令啊,难道这两条语句压入堆栈中的数据没有被使用?

作者: qaz19870418   发布时间: 2010-12-05

调用任务的时候,应该是默认压栈的吧。

作者: asmlearn   发布时间: 2010-12-06