在充分理解上述情况后,通过下列步骤,可以很容易地搭建一个OS映像文件开发环境。
1.创建一个Windows DLL工程
一般情况下,VC可以生成PE格式的可执行文件、DLL文件等文件类型,但可执行文件不太适合OS映像,因为编译器在编译的时候,自动在映像文件中加入一些其他代码,比如C运行期库的初始化代码等,这样会导致映像文件的体积变大。而DLL格式的文件则不会有这个问题,因此,建议从DLL开始来建立OS映像。
在Microsoft Visual C++中,按照图C-4所示创建一个DLL工程。
图C-4 创建一个动态链接库工程
2.设置项目编译与链接选项
一般情况下,需要对创建的工程设定如下编译链接选项。
(1)对齐方式,在项目选项中,添加/ALIGN:XXXX选项,告诉链接器,如何处理目标文件映像在内存中的对齐方式。一般情况下,需要设置为与目标文件在磁盘存储时的对齐方式一致,根据经验,设置为16一般是可以正常工作的。
(2)设置基址选项,修改默认情况下的加载地址,比如,目标文件在我们自己的操作系统中,从0x00100000(1MB)处开始加载,则在连接工程选项里面添加/BASE:0x00100000选项。(www.xing528.com)
(3)设置入口地址,一般情况下,如果不设置入口地址,编译器会选择缺省的函数作为入口,比如,针对可执行文件,是WinMain或main函数,针对动态链接库,是DllMain函数,或EntryPoint函数,等等。采用缺省的入口地址,有时候不能正确控制映像文件的行为,而且还可能导致映像文件尺寸变大,因为编译器可能在映像文件中插入了一些其他的代码。因此,建议手工设置入口地址。比如,假设我们的操作系统映像的入口地址是__init函数,则需要设定如下选项:/entry:?__init@@YAXXZ,其中,?__init@@YAXXZ是__init函数被处理后的内部标号,因为Visual C++采用了C++的名字处理模式,而C++支持重载机制,因此编译器可能把原始的函数名进行变换,变换成内部唯一的标号表示形式。
上述所有的设置,请参考图C-5。
图C-5 设置编译选项
在Visual C++6.0中,上述对话框可以从“project->setting…”打开,需要注意的是,打开的时候是针对DEBUG版本设定的,请一定选择Release版本进行设定。
3.对目标文件进行处理
完成上述设置,编译链接好目标文件以后,使用process工具对其进行处理,即可形成可直接加载的二进制模块。
4.映像文件的加载与运行
通过上述步骤(编译、链接、处理等),可以最终得到一个可执行的OS映像,只要把这个OS映像加载到内存中,跳转到该映像的开始处就可以运行了。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。