Foxdisk03-如何安装2

整个Foxdisk3.01的代码,是将安装程序和主程序混在一起编译的。安装程序负责将代码拷贝到指定的硬盘区域,包括MBR代码、Foxdisk的启动代码、Foxdisk的资源、Foxdisk的code段和数据段。在“如何安装1”中叙述的foxdisk在硬盘中的映像,都是由它来实现的。

混编的好处是,安装程序能够很容易的定位主程序各种段(code、data、stack等等)的位置,方便安装。另外,很多函数可以共用。坏处是,安装程序也要占据不少的空间。我之前为了方便C和汇编混合,设定了编译模式为small,也即Code段必须在64K内,Stack和Data段加起来在64K之内。我在设计初期没有考虑好,代码写到后半段就感到很痛苦—许多想实现的功能因为代码的限制,没法去实现。

现在的编译器早就取消了这样的限制,以技术而言,BorlandC++3.1已经是石器时代的产品。以我现在常用的Vs2015,从来不用去考虑类似这样的问题,可以专注在程序本身的实现。计算机软件的发展非常快,一不小心我也变成了老古董了。

回到正题。与安装相关的文件有Setup.c、Setup.h、iSetup.c和iSetup.h,与主程序共用了磁盘访问、图像显示等函数。外设的访问,在后面专门写几个章节进行介绍,用汇编去访问外设,我估计现在除了开发驱动或者OS的程序员,很少会有人去关注它们了。

从Setup.c的main()函数开始跟踪,了解安装过程。

main函数做了两件事情: 卸载和软件安装。卸载的过程故意设计得复杂,通过判断命令行以及热键,确定用户需要完全卸载,然后再将相应的扇区覆盖。这几天我重读代码,觉得这里的设计很有问题,有可能导致卸载后无法进入操作系统了。

软件安装通过两个函数实现,firstSetup()和updateSetup()。前一个函数是首次安装,后一个是针对已经安装的软件进行参数更改或者代码升级。main()最后的汇编代码:

asm mov ax,3

asm int 0x10

其作用为回到文本模式。程序是在DOS环境下,并使用图形模式安装的,如果没有回到文本模式,DOS的命令行无法执行。

通篇代码中,有大量嵌入汇编的地方。这种写法不是很好,程序可读性比较差,我主要是习惯了汇编来实现一些小功能,不自觉的就用上了。后续出现内嵌汇编的地方,都会给出解释。

firSetup()中,将安装主程序的步骤分为了四个,代码中给出了很详细的说明,很容易读懂。此函数中所调用的图形函数和磁盘访问函数,其功能都比较单一,通过函数说明可以了解其作用。

我尽量不去调用C的库函数,以防止代码量的增加。因此,很多经典的函数,比如memset、memcpy等,只能重新自己实现。另外一个原因,Foxdisk的主程序中,是没有操作系统的,那些库函数也没法运行。我参考的代码来自于linux2.6,不愧是千锤百炼的代码,非常精简高效。

firSetup()中频繁使用的汇编代码:

asm xor ax,ax

asm int 0x16

这段代码的功能是等待按键,类似于C语言中的getchar()或者pause()。

updateSetup()的实现代码在iSetup.c中,其实现方式类似于firSetup(),就不一一解释了。

这两个函数都打开了时钟中断,实现一些需要定时的功能。篇幅所限,不再详细说明,在后续章节中针对时钟中断做一个详细说明。

此条目发表在BIOS/UEFI分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注