《Linux内核完全剖解-基于0.12内核》head.s中的疑问
《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指令啊,难道这两条语句压入堆栈中的数据没有被使用?
[解决办法]调用任务的时候,应该是默认压栈的吧。