操作系统实验01——环境启动(实验)
Posted ^_^|
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统实验01——环境启动(实验)相关的知识,希望对你有一定的参考价值。
环境准备: https://gitee.com/cn-guoziyang/oslab/
步骤:
- 每次重置目录 ./init
- 进入linux0.11后 make clean 后再 make all
- 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内容修改
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。
setup.s:
(1)setup.s的编写,在一开始进入时,在屏幕显示,这里的代码可以仿照bootsect.s的
(2)在setup.s中,我们还要获取一些硬件参数,并将它们显示
! 以 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
以上是关于操作系统实验01——环境启动(实验)的主要内容,如果未能解决你的问题,请参考以下文章