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

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

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行开始的地方有如下代码:

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指令啊,难道这两条语句压入堆栈中的数据没有被使用?
...全文
81 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
asmlearn 2010-12-06
  • 打赏
  • 举报
回复
调用任务的时候,应该是默认压栈的吧。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧