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. 用push和pop操作调用main.c后就把处理器完全交给了main函数,以后就是main的天下,head.s函数就不会存在。而用call,似乎也可以,但这会在main结束是返回到head.s。
页:
[1]