实验目的
- 熟悉hit-oslab实验环境;
- 建立对操作系统引导过程的深入认识;
- 掌握操作系统的基本开发过程;
- 能对操作系统代码进行简单的控制,揭开操作系统的神秘面纱。
实验内容
此次实验的基本内容是:
- 阅读《Linux内核完全注释》的第6章,对计算机和Linux 0.11的引导过程进行初步的了解;
- 按照下面的要求改写0.11的引导程序bootsect.s
- 有兴趣同学可以做做进入保护模式前的设置程序setup.s。
改写bootsect.s主要完成如下功能:
- bootsect.s能在屏幕上打印一段提示信息“XXX is booting…”,其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等(可以上论坛上秀秀谁的OS名字最帅,也可以显示一个特色logo,以表示自己操作系统的与众不同。)
改写setup.s主要完成如下功能:
- bootsect.s能完成setup.s的载入,并跳转到setup.s开始地址执行。而setup.s向屏幕输出一行"Now we are in SETUP"。
- setup.s能获取至少一个基本的硬件参数(如内存参数、显卡参数、硬盘参数等),将其存放在内存的特定地址,并输出到屏幕上。
- setup.s不再加载Linux内核,保持上述信息显示在屏幕上即可。
开始实验
1、环境配置
(1)hit-oslab
实验环境简称 oslab,是一个压缩文件(hit-oslab-linux-20110823.tar.gz)
打开终端,输入如下命令解压hit-oslab
# 进入到 oslab 所在的文件夹
$ cd /home/shiyanlou/oslab/
# 解压,并指定解压到 /home/shiyanlou/
# 这样的话,在 /home/shiyanlou/oslab/ 中就能找到解压后的所有文件
$ tar -zxvf hit-oslab-linux-20110823.tar.gz
# 查看是否解压成功
$ ls -al
# 除了压缩包 hit-oslab-linux-20110823.tar.gz 之外,其他的就是压缩包中的内容
2、完成屏幕显示
1、进入oslab/linux-0.11/boot/,将bootsect.s移到桌面做备份,再自己新创建一个bootsect.s
(2)在新创建的文件中输入如下代码:
entry _start
_start:
mov ah,#0x03
xor bh,bh
int 0x10
mov cx,#36
mov bx,#0x0007
mov bp,#msg1
mov ax,#0x07c0
mov es,ax
mov ax,#0x1301
int 0x10
inf_loop:
jmp inf_loop
msg1:
.byte 13,10
.ascii "Hello OS world, my name is FHY"
.byte 13,10,13,10
.org 510
boot_flag:
.word 0xAA55
(3)终端进入 ~/oslab/linux-0.11/boot/ 目录
执行下面两个命令编译和连接bootsect.s
$ as86 -0 -a -o bootsect.o bootsect.s
$ ld86 -0 -s -o bootsect bootsect.o
如果这两个命令没有任何输出,说明编译与链接都通过了。
需要留意的文件是bootsect 的文件大小是 544 字节,而引导程序必须要正好占用一个磁盘扇区,即 512 个字节。造成多了 32 个字节的原因是 ld86 产生的是 Minix 可执行文件格式,这样的可执行文件处理文本段、数据段等部分以外,还包括一个 Minix 可执行文件头部
(4)执行下方命令去掉这 32 个字节的文件头部
$ dd bs=1 if=bootsect of=Image skip=32
(5)去掉这 32 个字节后,将生成的文件拷贝到 linux-0.11 目录下,并一定要命名为“Image”。然后“run!
# 将刚刚生成的 Image 复制到 linux-0.11 目录下
$ cp ./Image ../Image
# 执行 oslab 目录中的 run 脚本
$ ../../run
3、bootsect.s 读入 setup.s
(1)首先编写一个 setup.s,该 setup.s 可以就直接拷贝前面的 bootsect.s(还需要简单的调整),然后将其中的显示的信息改为:“Now we are in setup”。
如下图:
(2)将原来的bootsect.s修改成如下代码:
SETUPLEN=2
SETUPSEG=0x07e0
entry _start
_start:
mov ah,#0x03
xor bh,bh
int 0x10
mov cx,#36
mov bx,#0x0007
mov bp,#msg1
mov ax,#0x07c0
mov es,ax
mov ax,#0x1301
int 0x10
load_setup:
mov dx,#0x0000
mov cx,#0x0002
mov bx,#0x0200
mov ax,#0x0200+SETUPLEN
int 0x13
jnc ok_load_setup
mov dx,#0x0000
mov ax,#0x0000
int 0x13
jmp load_setup
ok_load_setup:
jmpi 0,SETUPSEG
msg1:
.byte 13,10
.ascii "Hello OS world, my name is FHY"
.byte 13,10,13,10
.org 510
boot_flag:
.word 0xAA55
(3)进入 linux-0.11 目录后,使用下面命令
$ make BootImage
会看到:
Unable to open 'system'
make: *** [BootImage] Error 1
(4)打开oslab/linux-0.11/tools/ 修改build.c
注释掉圈起来的部分:
(5)执行以下代码:
$ make BootImage
$ ../run
欢迎访问作者个人技术博客:www.blackvon.top
作者的微信公众号和小程序>