在Hello China的开发过程中,采用NASM和Visual C++6.0等工具完成了不同操作系统模块的开发和编译、链接。其中,NASM完成汇编语言实现的模块的编译和链接,其他由C语言完成的模块,则由VC编译和链接。
1.NASM的使用
在当前版本的Hello China的实现中,汇编语言实现的模块都按照纯二进制格式进行编译,即编译的可执行映像的结果与汇编语言源文件的逻辑完全一致,没有任何编译器附加的头信息。这样的纯二进制模块,可通过下列步骤开发完成。
(1)采用任何一个文本编辑器(比如DOS操作系统下的edit)编辑汇编语言源程序,并保存为.ASM文件。
(2)采用NSAM程序编译上述文件,格式为:
其中xxx.asm是待编译的汇编语言源文件,xxx.bin是编译的结果文件。
所有[/kernel/arch/sysinit]目录下的汇编语言文件,都是按照上述方式编译的。
2.Visual C++的使用
Hello China的绝大部分核心功能是采用C语言编写完成的,采用Visual C++6.0作为编译链接工具。下列步骤描述了Hello China开发过程中开发环境的搭建。
步骤一:创建一个DLL工程
一般情况下,VC可以生成PE格式的可执行文件、DLL文件等文件类型,但可执行文件不太适合作OS映像,因为编译器在编译的时候,会自动在映像文件中加入一些其他代码,比如C运行期库的初始化代码等,导致映像文件的体积变大。而DLL格式的文件则不会有这个问题,因此,建议从DLL开始来建立OS映像。
在Microsoft Visual C++中创建一个DLL工程,如图2-12所示。
图2-12 创建一个DLL工程
步骤二:设置项目编译与链接选项
一般情况下,需要对创建的工程设定如下编译链接选项。(www.xing528.com)
(1)对齐方式,在项目选项中,添加/ALIGN:XXXX选项,告诉链接器如何处理目标文件映像在内存中的对齐方式,一般情况下,需要设置为与目标文件在磁盘存储时的对齐方式一致,根据经验,设置为16是可以正常工作的。
(2)设置基址选项,修改默认情况下的加载地址,比如目标文件在我们自己的操作系统中从0x00100000(1M)处开始加载,则在链接工程选项里面添加/BASE:0x00100000选项。针对master模块,其加载地址是0x00110000,因此base应该配置为0x00110000。
(3)设置入口地址,如果不设置入口地址,编译器会选择缺省的函数作为入口,比如针对可执行文件是WinMain或main,针对动态链接库是DllMain或EntryPoint等,采用缺省的入口地址,有时候不能正确地控制映像文件的行为,还可能导致映像文件尺寸变大,因为编译器可能在映像文件中插入一些其他的代码。因此,建议手工设置入口地址,比如,假设我们的操作系统映像的入口地址是__init函数,则需要设定如下选项:/entry:?__init@@YAXXZ,其中,?__init@@YAXXZ是__init函数被处理后的内部标号,因为Visual C++采用了C++的名字处理模式,而C++支持重载机制,所以编译器可能把原始的函数名变换成内部唯一的标号表示形式,关于如何确定一个函数的内部标号表示,请参考附录。
上述所有的设置,如图2-13所示。
图2-13 设置编译、链接选项
在Visual C++6.0中,上述对话框可以从“project→settings…”打开,需要注意的是,打开时,是针对Debug版本设定的,请一定选择Release版本进行设定(图中左上角椭圆中注明的地方)。
步骤三:编辑源文件,编译链接
上述步骤完成之后,集成开发环境就设置好了,剩下的工作就是直接在该工程中添加C源代码文件,完成编码工作。编码完成之后,即可编译链接该项目了。需要注意的是,在编译的时候,要使用Release方式编译,即选择菜单build→Batch build,在弹出的对话框中选中Release选项,如图2-14所示。
然后单击Rebuild All按钮即可。
3.编译后模块的进一步处理
上述开发环境搭建完毕,就可以在该开发环境下进行操作系统的开发工作了。其中,由NASM编译的二进制映像直接可以加载到内存中运行,但由Visual C++编译的二进制模块却是一个Windows操作系统下的DLL文件,是无法直接加载到内存中运行的,这时候需要对其进行预处理。预处理的目的以及预处理方法的实现机制,请参考本书附录中的相关内容,下面仅仅给出预处理的操作步骤。
(1)把Visual C++编译链接而成的目标文件(Release版本的DLL文件)复制到与process.exe相同的目录下,其中,process.exe就是预处理程序。
(2)运行process.exe程序修改上述DLL文件,比如:process–i master.dll–o master.bin,即对master.dll文件进行修改处理,处理结果即为master.bin文件,其中master.dll文件内容保持不变。修改之后,master.bin模块就可以直接加载到内存中运行了。
图2-14 使用Release方式构建项目
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。