DAY1-操作系统的引导(附环境搭建)

实验二 操作系统的引导 + 环境搭建

主要学习网易云课堂上哈工大李志军的(操作系统基础)和(操作系统原理与实践)[https://www.lanqiao.cn/courses/115/learning/?id=568]
(实验说明书)[https://hoverwinter.gitbooks.io/hit-oslab-manual/content/bochs-manual.html]

注:我是Ubuntu16.04环境下,按照下面步骤进行的,但是到../../run这步时,会出现下面情况。
在这里插入图片描述
按照(Ubuntu18.04搭建linux0.11实验环境)[https://blog.csdn.net/qq_40758751/article/details/88707214?utm_medium=distribute.pc_relevant.none-task-blog-blogcommendfrommachinelearnpai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-blogcommendfrommachinelearnpai2-3.channel_param]这篇博客,最终成功。里面安装包百度云:
链接:https://pan.baidu.com/s/1gePywI5Q2vOGiZu0ZBwKQg
提取码:cwnz

  1. https://gitee.com/ivan_allen/hit-oslab/tree/master/ clone到Ubuntu16.04虚拟机中。

    1
    $ git clone https://gitee.com/ivan_allen/hit-oslab.git
  2. 根据readme解压安装,执行完下面句子后,Home中会出现oslab目录

    1
    2
    $ cd hit-oslab
    $ ./setup.sh
  3. 进入oslab目录下的boot

    1
    $ cd  ~/oslab/linux-0.11/boot/
  4. 执行下面两个命令编译和链接 bootsect.s:

    1
    2
    $ as86 -0 -a -o bootsect.o bootsect.s
    $ ld86 -0 -s -o bootsect bootsect.o
  5. ls -l查看到bootsect有544字节(bootsect 是编译、链接后的目标文件),但引导程序必须要正好占用一个磁盘扇区,即 512 个字节。所以在 Ubuntu 下用命令:

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

    生成的 Image 就是去掉文件头的 bootsect。

  6. run

    1
    2
    3
    4
    5
    6
    7
    # 当前的工作路径为 /home/shiyanlou/oslab/linux-0.11/boot/

    # 将刚刚生成的 Image 复制到 linux-0.11 目录下
    $ cp ./Image ../Image

    # 执行 oslab 目录中的 run 脚本
    $ ../../run

6.3的实验结果

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
!/home/ly/oslab/linux-0.11/boot/bootsect.s
.globl begtext, begdata, begbss, endtext, enddata, endbss
.text
begtext:
.data
begdata:
.bss
begbss:
.text

BOOTSEG = 0x07c0 ! boot-sector的原始地址(段基址)
INITSEG = 0x9000 ! 将bootsect移到这里

entry _start ! 告知链接程序,从start标号开始执行
_start:
! 首先读入光标位置
mov ah,#0x03
xor bh,bh
int 0x10
! 显示字符串 “Hello OS world, my name is LY”
mov cx,#35
mov bx,#0x0007
mov bp,#msg1

! es:bp 是显示字符串的地址
mov ax,#BOOTSEG
mov es,ax
mov ax,#0x1301 ! write string, move cursor
int 0x10
inf_loop:
jmp inf_loop

msg1:
.byte 13,10
.ascii "Hello OS world, my name is LY"
.byte 13,10,13,10

.org 510
boot_flag:
.word 0xAA55

.text
endtext:
.data
enddata:
.bss
endbss:

截图:
在这里插入图片描述