注:本文档为《从0学x86操作系统》课程配套的学习文档,提供相应的辅助学习资料和答疑勘误。 有关该课程的信息,请点击这里访问:https://study.163.com/provider/1017884735/index.htm 在阅读本文档时,如有疑问和建议,欢迎在下方留言或者直接联系我。

本课时主要目的是创建loader工程,编写简单的代码,并实现从boot进入到loader中运行。与此同时还将了解到如何从汇编语言进入到C语言环境中运行。
课程中实现了两级跳转:从汇编到C,再从boot到loader。

从汇编语言跳到C语言

从汇编跳转到C语言执行,有两种方式:一是用JMP直接跳转过去;二是用CALL指令进行函数调用。
在本课时中,由于是从boot中的汇编跳转到C语言,无需返回,所以直接用JMP跳转。
在使用前,先用.extern boot_entry导入外部boot_entry符号,然后再用jmp boot_entry跳转。

跳转到指定loader运行

boot和loader分属两个工程,共生成两个bin文件。
从boot跳到loader,只知道loader的起始地址为0x8000,所以采用函数指针转换。(void ()(void) 为无参数、无返回值的函数类型。((void ()(void))LOADER_START_ADDR)() 即认为在0x8000地址处存放了这种类型的函数的代码,通过调用函数函数进入到loader中运行。

注:无论是boot还是loader,其工程均已经配置好让start.S中的代码位于生成的bin文件开头。所以无论是boot还是loader,其最开头的指令总是程序的入口指令。

有关函数指针的定义及其使用,请参考相关的C语言书籍。