操作系统实验01——环境启动(实验)

环境准备: https://gitee.com/cn-guoziyang/oslab/

步骤:

  1. 每次重置目录 ./init
  2. 进入linux0.11后 make clean 后再 make all
  3. cd ~/oslab 然后 ./run

注意点:

本次实验按照要求来,不用每次都make all再run
如在完成修改bootsect.s后依次执行:

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

$ dd bs=1 if=bootsect of=Image skip=32  // 我们会发现Image为 544 造成多了 32 个字节的原因是 ld86 产生的是 Minix 可执行文件格式,这样的可执行文件处理文本段、数据段等部分以外,还包括一个 Minix 可执行文件头部(如果执行make,那么build.c内已经完成此步)

# 当前的工作路径为 /home/shiyanlou/oslab/linux-0.11/boot/

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

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

包括后序编译bootsect.s和setup.s,都按着要求一步一步来。

下面记录实验内容:

bootsect.s:
这里我们要在屏幕显示内容,主要调用int 0x10,将 bp 处的字符串输出(cx)个,所以一方面要改msg1里的内容,另一方面将对应的cx内容修改
操作系统实验01——环境启动(实验)_第1张图片
ORG用于指定该伪指令后面的源程序存放的起始地址,也就是汇编后的目标机器码存放的首地址。
此处由原来的508改为510是因为原来有root_dev占两个字节
在这里插入图片描述
为了保证 boot_flag 一定在最后两个字节,所以要修改 .org,后移2字节。

build.c:
build.c 从命令行参数得到 bootsect、setup 和 system 内核的文件名,将三者做简单的整理后一起写入 Image。其中 system 是第三个参数(argv[3])。当 “make all” 或者 “makeall” 的时候,这个参数传过来的是正确的文件名,build.c 会打开它,将内容写入 Image。而 “make BootImage” 时,传过来的是字符串 “none”。bootimage只考虑了bootsect和setup。
因此在build.c中忽略所有与与system有关的工作或者在该写system的位置写0。
操作系统实验01——环境启动(实验)_第2张图片

操作系统实验01——环境启动(实验)_第3张图片

setup.s:
(1)setup.s的编写,在一开始进入时,在屏幕显示,这里的代码可以仿照bootsect.s的
(2)在setup.s中,我们还要获取一些硬件参数,并将它们显示
操作系统实验01——环境启动(实验)_第4张图片

!16 进制方式打印栈顶的16位数
print_hex:
! 4 个十六进制数字
    mov cx,#4
!(bp)所指的值放入 dx 中,如果 bp 是指向栈顶的话
    mov dx,(bp)
print_digit:
! 循环以使低 4 比特用上 !! 取 dx 的高 4 比特移到低 4 比特处。
    rol dx,#4
! ah = 请求的功能值,al = 半字节(4 个比特)掩码。
    mov ax,#0xe0f
! 取 dl 的低 4 比特值。
    and al,dl
! 给 al 数字加上十六进制 0x30
    add al,#0x30
    cmp al,#0x3a
! 是一个不大于十的数字
    jl  outp
! 是a~f,要多加 7
    add al,#0x07
outp:
    int 0x10
    loop    print_digit
    ret
! 这里用到了一个 loop 指令;
! 每次执行 loop 指令,cx 减 1,然后判断 cx 是否等于 0! 如果不为 0 则转移到 loop 指令后的标号处,实现循环;
! 如果为0顺序执行。
!
! 另外还有一个非常相似的指令:rep 指令,
! 每次执行 rep 指令,cx 减 1,然后判断 cx 是否等于 0。
! 如果不为 0 则继续执行 rep 指令后的串操作指令,直到 cx 为 0,实现重复。

! 打印回车换行
print_nl:
! CR
    mov ax,#0xe0d
    int 0x10
! LF
    mov al,#0xa
    int 0x10
    ret

你可能感兴趣的:(操作系统实验)