哈工大操作系统实验1-操作系统引导
实验内容:
1. 改写 bootsect.s 主要完成如下功能:
bootsect.s 能在屏幕上打印一段提示信息“XXX is booting...”,
其中 XXX 是你给自己的操作系统起的名字,例如 LZJos、Sunix 等
2. 改写 setup.s 主要完成如下功能:
2.1 bootsect.s 能完成 setup.s 的载入,并跳转到 setup.s 开始地址执行。
而 setup.s 向屏幕输出一行"Now we are in SETUP"。
2.2 setup.s 能获取至少一个基本的硬件参数,如内存参数、显卡参数、
硬盘参数等.将其存放在内存的特定地址,并输出到屏幕上。
2.3 setup.s 不再加载 Linux 内核,保持上述信息显示在屏幕上即可。
本实验主要是为了说明开机上电之后,计算机的如何启动的过程:(全部是汇编代码)
- 从磁盘第一扇区读取bootsect.s,通过bios中断,读取setup.s和system模块。
- setup.s从bios读取基本系统参数(光标位置、内存大小等)进入保护模式。
- 设置IDT表和GDT表,调用main函数,进而进入C语言相关系统代码。
实验
注意:BIOS 0X10中断:显示字符串;BIOS 0X13中断:读取磁盘内容。
实验之前请参考我的博客,实验0,进行linux内核文件的解压缩。
实验(1):bootsect.s修改,即显示自己定义的字符串:
1.a首先一种简单的修改方法:
直接修改bootsect.s中98行和246行的内容:
246行修改为自己想改的字符串之后,修改98行cx寄存器的数值即可
1.b按照实验说明重写bootsect.s和setup.s 文件:
cd ~/oslab/linux-0.11/boot/
rm -f bootsect.s #进入文件夹删除bootsect.s,重写bootsect.s
vim bootsect.s
新的bootsect.s内容:
entry _start
_start:
mov ah,#0x03
xor bh,bh
int 0x10
mov cx,#20 //显示的字符长度
mov bx,#0x0007
mov bp,#msg1
mov ax,#0x07c0
mov es,ax
mov ax,#0x1301
int 0x10
z_loop:
jmp z_loop
msg1:
.byte 13,10
.ascii "zzy say hello!" //显示的字符
.byte 13,10,13,10
.org 510
boot_flag:
.word 0xAA55
修改之后进行编译:
$ as86 -0 -a -o bootsect.o bootsect.s
$ ld86 -0 -s -o bootsect bootsect.o
$ dd bs=1 if=bootsect of=Image skip=32 //删除刚开始的32个byte,使其正好为520 byte,即一个扇区大小
运行:
# 当前的工作路径为 /home/shiyanlou/oslab/linux-0.11/boot/
# 将刚刚生成的 Image 复制到 linux-0.11 目录下
$ cp ./Image ../Image
# 执行 oslab 目录中的 run 脚本
$ ../../run
运行示意图:
实验(2)修改setup.s
修改setup.s内容为:
entry _start
_start:
mov ah,#0x03
xor bh,bh
int 0x10
mov cx,#29 //显示的字符长度
mov bx,#0x0007
mov bp,#msg2
mov ax,cs
mov es,ax
mov ax,#0x1301
int 0x10
z_loop:
jmp z_loop
msg1:
.byte 13,10
.ascii "now we are in zzy SETUP" //显示的字符
.byte 13,10,13,10
.org 510
boot_flag:
.word 0xAA55
bootsect.s改为:
SETUPLEN=2
SETUPSEG=0x07e0
entry _start
_start:
mov ah,#0x03
xor bh,bh
int 0x10
mov cx,#20
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 "zzy say hello!"
.byte 13,10,13,10
.org 510
boot_flag:
.word 0xAA55
修改tools/build.c: 根据实验指导注释掉最后的内容。编译运行: