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

later_equals_never later_equals_never 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在阅读《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指令啊,难道这两条语句压入堆栈中的数据没有被使用?
...全文

相关推荐

评论 1
收藏 已收藏
分享
返回顶部
later_equals_never
汇编语言 21,500 成员 41,619 内容