当前位置: 代码迷 >> 汇编语言 >> 《Linux内核完全剖解-基于0.12内核》head.s中的疑问
  详细解决方案

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

热度:1460   发布时间:2013-02-26 00:00:00.0
《Linux内核完全剖析-基于0.12内核》head.s中的疑问
在阅读《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  2f1:  movl $0, current    ljmp $TSS0_SEL, $02:  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指令啊,难道这两条语句压入堆栈中的数据没有被使用?


------解决方案--------------------------------------------------------
调用任务的时候,应该是默认压栈的吧。
  相关解决方案