首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-07-18 
《Linux内核完全剖析-基于0.12内核》head.s中的疑问在阅读《Linux内核完全剖析-基于0.12内核》中的第四章提供

《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指令啊,难道这两条语句压入堆栈中的数据没有被使用?


[解决办法]
调用任务的时候,应该是默认压栈的吧。

热点排行