哈工大操作系统实验1-操作系统引导

哈工大操作系统实验1-操作系统引导哈工大操作系统实验1-操作系统引导实验内容:1.改写bootsect.s主要完成如下功能:bootsect.s能在屏幕上打印一段提示信息“XXXisbooting…”,其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等2.改写setup.s主要完成如下功能:2.1bootsect.s能完成setup.s的载入,并跳转到setup.s开始地址执行。而setup.s向屏幕输出一行”NowweareinSETUP”。2.2s

哈工大操作系统实验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 内核,保持上述信息显示在屏幕上即可。

本实验主要是为了说明开机上电之后,计算机的如何启动的过程:(全部是汇编代码)

  1. 从磁盘第一扇区读取bootsect.s,通过bios中断,读取setup.s和system模块。
  2. setup.s从bios读取基本系统参数(光标位置、内存大小等)进入保护模式。
  3. 设置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: 根据实验指导注释掉最后的内容。编译运行:
在这里插入图片描述

今天的文章哈工大操作系统实验1-操作系统引导分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/32344.html

(0)
编程小号编程小号

相关推荐

发表回复

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