操作系统实验一之引导程序

一, 实验内容

改写bootsect.s和setup.s, 完成如下主要功能:

1, bootsect.s能够在屏幕上打印一段提示信息"XXX is booting...", 其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等.

2, bootsect.s能够完成setup.s的载入, 并跳转到setup.s开始地址执行. 

3, setup.s能够像屏幕输出一行信息 "Now we are in SETUP" 

4, setup.s能获取至少一个基本的硬件参数(如内存参数、显卡参数、硬盘参数等),将其存放在内存的特定地址,并输出到屏幕上。

5,setup.s不再加载linux内核, 保持上述信息显示到屏幕上即可

二, 实验基础知识

1。启动流程  
这里写图片描述

三, 实验步骤

1, 完成bootsect的屏幕输出功能

  由于不需要加载linux内核,所以就不需要原始的linux代码那么复杂,比如: 将bootsect自身移动到0x90000处等操作,可以忽略的。

  要显示字符串,那么字符串显示到屏幕的哪里呢?当然是当前光标的位置了!所以第一步就要先读取光标的位置,这可以利用10号中断的3号子程序来完成。要显示字符串,可以利用10号功能的13号子程序来完成,需要注意的是一定要边显示字符边移动光标,最终的光标要移动到字符串的末尾处。最后要注意用0xAA55来标记引导扇区。代码如下:

entry _start
_start:
! 首先利用10号中断的3号功能来读取光标位置
    mov    ah,#0x03        
    xor    bh,bh            
    int    0x10

! 再利用10号中断的13号功能显示字符串
    mov    cx,#50            ! 加上回车和换行,字符串一共包含50个字符,所以设置cx为50
    mov    bx,#0x0007
    mov    bp,#msg1
    mov     ax,#0x07c0
    mov     es,ax            ! es:bp=显示字符串的地址
    mov    ax,#0x1301        
    int    0x10

Inf_loop:
    jmp Inf_loop            ! 无限循环

! msg1处放置要显示的字符串
msg1:
    .byte 13,10            ! 换行+回车
    .ascii "AXF OS is booting, my name is Aixiangfei ..."
    .byte 13,10,13,10        ! 两对换行+回车

! 下面是启动盘具有有效引导扇区的标志. 仅供BIOS中的程序加载扇区时识别使用。
! 它必须位于引导扇区的最后两个字节中.
.org 510
boot_flag:
    .word 0xAA55    ! 引导扇区的标记就是0XAA55

编译和运行: 进入~/oslab/linux-0.11/boot/目录,编译并连接:

as86 -0 -a -o bootsect.o bootsect.s
ld86 -0 -s -o bootsect bootsect.o

  参数说明:-0(注意:这是数字0,不是字母O)表示生成8086的16位目标程序,-a表示生成与GNU as和ld部分兼容的代码,-s告诉链接器ld86去除最后生成的可执行文件中的符号信息。

  如果这两个命令没有任何输出,说明编译与链接都通过了。需要留意的生成的bootsect的大小是544字节,而引导程序必须要正好占用一个磁盘扇区,即512个字节。造成多了32个字节的原因是ld86产生的是Minix可执行文件格式,这样的可执行文件处理文本段、数据段等部分以外,还包括一个Minix可执行文件头部。所以最后必须要把这多余的32个字节删掉,可以用linux自带的工具dd来完成:

dd bs=1 if=bootsect of=Image skip=32

  去掉这32个字节后,将生成的文件拷贝到linux-0.11目录下,并一定要命名为“Image”(注意大小写)。然后就可以run了

2, setup的载入

  首先要确定setup是在磁盘的0磁道2扇区,linux 0.11中的setup占了4个扇区,而我们最后要写的setup显然没有那么复杂,所以可以只用1个扇区就可以了。另外,由于bootsect位于0x7c00处,占用512个字节,所以可以将setup载入到0x7e00处。要想从磁盘中载入数据到内存,可以利用BIOS提供的13号中断轻松完成。最后就直接用jumi指令跳转到0x7e00处即可。对前面的bootsect.s扩展之后的完整代码如下:

SETUPLEN = 1
SETUPSEG = 0x07e0

entry _start
_start:
! 首先利用10号中断的3号功能来读取光标位置
    mov    ah,#0x03        
    xor    bh,bh            
    int    0x10

! 再利用10号中断的13号功能显示字符
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作系统实验一到实验九csdn为一个教程系列的网站,旨在帮助学习者理解操作系统的基本概念和原理,并在实践中加深对操作系统的认识和理解。以下是针对每个实验的简要介绍: 实验一:操作系统引导程序设计。通过设计一个简单的引导程序,了解操作系统的启动过程和引导程序的编写方法。 实验二:可执行程序加载和运行。学习如何将一个可执行程序加载到内存中并运行,理解操作系统是如何管理进程和内存的。 实验三:中断处理。学习中断的概念和中断处理程序的编写方法,了解操作系统是如何响应硬件中断和软件中断的。 实验四:进程管理。学习进程的概念和进程控制块的结构,了解操作系统是如何管理进程的创建、调度和终止的。 实验五:进程同步。了解进程同步的概念和常用的同步机制,如互斥、信号量等,学习如何解决进程间的互斥和同步问题。 实验六:进程通信和消息传递。学习进程间通信的方式和消息传递的机制,了解不同的通信模型和通信机制的特点和适用场景。 实验七:内存管理(1)。理解操作系统的内存管理机制,学习虚拟内存的概念和重要性,了解分页和分段的内存管理方式。 实验八:内存管理(2)。深入学习虚拟内存和页面置换算法,了解页面置换的原理和常用算法,如LRU、FIFO等。 实验九:文件管理(1)。学习文件管理的概念和文件系统的组织方式,了解文件的创建、读写和删除的过程,以及文件系统的数据结构和相关操作。 通过完成这一系列的实验,学习者能够全面了解操作系统的核心概念和基本原理,并具备实践操作系统的能力。在csdn上可以找到相应的实验指导和相关资源,帮助学习者顺利完成实验并加深对操作系统的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值