哈工大操作系统 实验楼实验二 操作系统的引导
实验楼实验二 操作系统的引导
bootsec.s文件
编写bootsec.s文件
在 oslab/linux-0.11/boot
目录下将原来的bootsect.s
改名为bootsect.s.bak
,即执行命令
$ mv bootsect.s bootsect.s.bak
并新建一个并编写bootsect.s
,命令如下:
$ vim bootsect.s
代码如下:
|
|
编译
在boot
目录下,执行下面的命令:
- 编译
$ as86 -0 -a -o bootsect.o bootsect.s
-0(是数字'0’)以16位代码段运行,当使用了高于8086指令集的指令时警告
-a 使汇编程序部分兼容于Minix asld.交换了[]与()的用法,并且改变了一些16位跳转与调用的语法(“jmp @(bx)” 就成了一个合法的指令),生成与 GNU as 和 ld 部分兼容的代码
- 链接
$ ld86 -0 -s -o bootsect bootsect.o
-0(是数字零)产生具有16bit魔数的头结构,并且对-lx选项使用i86子目录
-s 告诉链接器 ld86 去除最后生成的可执行文件中的符号信息
- 生成文件
|
|
其中 bootsect.o 是中间文件;bootsect 是编译、链接后的目标文件,也就是可执行文件
运行
需要注意的文件是 bootsect 文件大小是 544 字节,而引导程序必须要正好占用一个磁盘扇区,即 512 个字节。多出来的32字节是Minix可执行文件头部,去掉这 32 个字节后就可以放入引导扇区了。可以使用dd
命令进行处理
$ dd -bs=1 if=bootsect of=Image skip=32
之后复制该文件到linux-0.11
目录下,并运行系统查看显示结果
$ cp ./Image ../Image
运行
!注意目前还位于/oslab/linux-0.11/boot
下
$ ../../run
运行截图:
setup.s文件
编写setup.s文件
在
|
|
修改前面写的 bootsect.s
我们需要编写 bootsect.s 中载入 setup.s 的关键代码
|
|
个人理解:
load_setup
主要是将指定位置(0磁道2扇区)和数量(这里是SETUPLEN=2)的扇区读入内存(es:bx=07c0H:0200H即地址(07c0H✖10)+200H=07e00H),再将(cs:ip指向07e0:0000)执行setup
部分的代码
补充: 入口参数: AH=02H(功能号:02H 表示读扇区)
AL=扇区数
CH=柱面
CL=扇区
DH=磁头
DL=驱动器,00H ~ 7FH:软盘;80H ~ 0FFH:硬盘
ES:BX=缓冲区的地址(读出数据的缓冲区地址) 出口参数: 若出错则CF示志置位 CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见下图:
编写完成后的完整代码
|
|
再次编译
借助 Makefile 编译、链接bootsect.s和setup.s
在此之前我们需要修改一下tools/build.c
,因为这个是生成整个系统镜像的,我们只需要bootsect.s
和setup.s
。
注释掉build.c
后面几段代码,如下图所示
最后切换到linux-0.11
目录下,执行以下命令:
$ make BootImage
输入以下命令运行:
$ ../run
运行截图
setup.s 获取基本硬件参数
取出硬盘各参数放在了 0x90000 处,并通过十六进制打印在屏幕上
setup.s完整代码:
|
|
回到linux-0.11
目录下,执行命令:
$ make clean
$ make BootImage
$ ../run
运行截图
补充: 硬盘基本参数表: