unix-linux 发表于 2007-10-14 15:20:08

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

# 下面这几个入栈操作(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.

henglong 发表于 2007-12-25 12:37:02

用push和pop操作调用main.c后就把处理器完全交给了main函数,以后就是main的天下,head.s函数就不会存在。而用call,似乎也可以,但这会在main结束是返回到head.s。
页: [1]
查看完整版本: head.s中调用main为什么不直接call或者jmp而将其作为返回地址