QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2709|回复: 1

head.s中调用main为什么不直接call或者jmp而将其作为返回地址

[复制链接]
发表于 2007-10-14 15:20:08 | 显示全部楼层 |阅读模式
# 下面这几个入栈操作(pushl)用于为调用/init/main.c 程序和返回作准备。
# 前面3 个入栈指令不知道作什么用的,也许是Linus 用于在调试时能看清机器码用的?。
# 139 行的入栈操作是模拟调用main.c 程序时首先将返回地址入栈的操作,所以如果
# main.c 程序真的退出时,就会返回到这里的标号L6 处继续执行下去,也即死循环。
# 140 行将main.c 的地址压入堆栈,这样,在设置分页处理(setup_paging)结束后
# 执行'ret'返回指令时就会将main.c 程序的地址弹出堆栈,并去执行main.c 程序去了。
after_page_tables:
pushl $0 # These are the parameters to main :-)
pushl $0 # 这些是调用main 程序的参数(指init/main.c)。
pushl $0
pushl $L6 # return address for main, if it decides to.


pushl $_main # '_main'是编译程序对main 的内部表示方法。为什么不直接call _main或者jmp _main


jmp setup_paging # 跳转至第198 行。
L6:
jmp L6 # main should never return here, but
# just in case, we know what happens.
发表于 2007-12-25 12:37:02 | 显示全部楼层
用push和pop操作调用main.c后就把处理器完全交给了main函数,以后就是main的天下,head.s函数就不会存在。而用call,似乎也可以,但这会在main结束是返回到head.s。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-22 08:34 , Processed in 0.035781 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表