当前位置: 代码迷 >> 综合 >> 哈工大操作系统之基础(Lab1 控制系统启动过程实验)
  详细解决方案

哈工大操作系统之基础(Lab1 控制系统启动过程实验)

热度:40   发布时间:2023-11-17 18:12:56.0

文章目录

    • 专栏博客链接
    • 前引
    • 详细步骤链接(方便查阅)
    • Phase 1 bootsect 显示
    • Phase 1 bootsect 显示实现
    • Phase 2 读入Setup.s
    • Phase 2 读入Setup.s 实现
    • Phase 3 获取硬件参数 + 显示获得的参数
    • Phase 3 获取硬件参数 + 显示获得的参数实现


专栏博客链接

哈工大操作系统原理与实践 Lab全实验博客链接


前引


从这个Lab开始 我也开始重新学习操作系统知识
这个Lab是来源于网易云课堂 哈工大的公开课
我也是听了几讲 觉得确实讲的很好

大概是前20天左右 我拿起了现代操作系统
在阅读了一番之后 阅读了前六章 觉得操作系统还是十分遥远
仅限于一个抽象的概念
而这些Lab的代码是用Linux 0.11 实践+理论的综合
直接切入汇编源代码让我们学习操作系统

绝知此事要躬行
写这个记录也是想要做个总结
对自己实验做一个记录


详细步骤链接(方便查阅)


哈工大-操作系统的引导


Phase 1 bootsect 显示


这里先写一下我理解的 操作系统是如何读入的
在计算机开启时 内存中是什么都没有的
而我们是可以读入0磁道0扇区的内容

0磁道0柱面1扇区是我们的引导扇区
里面就是我们读入的第一个程序
而这个程序我们需要做许多事情

这个Lab 我们需要修改的就是bootsect
第一个引导扇区的内容

我们首先需要打开bootsect.s 汇编文件
我们首先关注这个Lab的目的 是让我们完成屏幕输出功能

其中的步骤我觉得 Lab旁边的步骤已经解释的足够好了
我这里再做一点注释
我们是利用了BIOS的提供的基本功能 INT 0X10中断调用来实现的
此时还没有操作系统

INT 0X10 寄存器中储存的值也是相应的数据
寄存器CX中储存的就是字符数 BX的高位是多少页显示 AX的低位是字符

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

这里还有 INT 0X13的中断功能
在这里插入图片描述


Phase 1 bootsect 显示实现


在这里插入图片描述

在这里插入图片描述


Phase 2 读入Setup.s


这里我就研究了一下设值 并且对一个地方有了一定的理解
对于Lab的老师注释的地方我觉得已经解释的够清楚了

就是当我们把第一个扇区的读入内存后
紧接着我们要读入第二扇区的内容 读到内存中
这样我们才能执行
而一个扇区是512字节
刚开始我们的BootSect在内存中是 0x7c00 段地址
我们按照 十六进制来推算 512 == 0x200
而地址计算的时候 段地址<<4+偏移地址才是实地址
所以我们把读入的扇区放到了地址 0x07c0+0x0020 = 0x07e0位置


Phase 2 读入Setup.s 实现


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


Phase 3 获取硬件参数 + 显示获得的参数


对于这部分 我认为其实
函数调用部分挺少的
主要应用的就是 对于一个BIOS中断 我们从内存中获取硬件信息的
一个调用
而且专门为此 我还去搜了每个调用需要的寄存器 和相关的ax数是多少
才能调用此功能
但发现实在是太杂太杂了
而且对于后面的 指针 硬件信息的输出
那个也是看的我脑壳疼 信息太多太杂了
到最后我就跟着示例代码敲了一遍
然后大部分的代码能够理解的我去理解了为什么这样调用
我的这一Phase就算结束了


Phase 3 获取硬件参数 + 显示获得的参数实现


示例代码

INITSEG  = 0x9000
entry _start
_start:
! Print "NOW we are in SETUP"mov ah,#0x03xor bh,bhint 0x10mov cx,#25mov bx,#0x0007mov bp,#msg2mov ax,csmov es,axmov ax,#0x1301int 0x10mov ax,csmov es,ax
! init ss:spmov ax,#INITSEGmov ss,axmov sp,#0xFF00! Get Paramsmov ax,#INITSEGmov ds,axmov ah,#0x03xor bh,bhint 0x10mov [0],dxmov ah,#0x88int 0x15mov [2],axmov ax,#0x0000mov ds,axlds si,[4*0x41]mov ax,#INITSEGmov es,axmov di,#0x0004mov cx,#0x10repmovsb! Be Ready to Printmov ax,csmov es,axmov ax,#INITSEGmov ds,ax! Cursor Positionmov ah,#0x03xor bh,bhint 0x10mov cx,#18mov bx,#0x0007mov bp,#msg_cursormov ax,#0x1301int 0x10mov dx,[0]call    print_hex
! Memory Sizemov ah,#0x03xor bh,bhint 0x10mov cx,#14mov bx,#0x0007mov bp,#msg_memorymov ax,#0x1301int 0x10mov dx,[2]call    print_hex
! Add KBmov ah,#0x03xor bh,bhint 0x10mov cx,#2mov bx,#0x0007mov bp,#msg_kbmov ax,#0x1301int 0x10
! Cylesmov ah,#0x03xor bh,bhint 0x10mov cx,#7mov bx,#0x0007mov bp,#msg_cylesmov ax,#0x1301int 0x10mov dx,[4]call    print_hex
! Headsmov ah,#0x03xor bh,bhint 0x10mov cx,#8mov bx,#0x0007mov bp,#msg_headsmov ax,#0x1301int 0x10mov dx,[6]call    print_hex
! Secotrsmov ah,#0x03xor bh,bhint 0x10mov cx,#10mov bx,#0x0007mov bp,#msg_sectorsmov ax,#0x1301int 0x10mov dx,[12]call    print_hexinf_loop:jmp inf_loopprint_hex:mov    cx,#4
print_digit:rol    dx,#4mov    ax,#0xe0fand    al,dladd    al,#0x30cmp    al,#0x3ajl     outpadd    al,#0x07
outp:int    0x10loop   print_digitret
print_nl:mov    ax,#0xe0d     ! CRint    0x10mov    al,#0xa     ! LFint    0x10retmsg2:.byte 13,10.ascii "NOW we are in SETUP".byte 13,10,13,10
msg_cursor:.byte 13,10.ascii "Cursor position:"
msg_memory:.byte 13,10.ascii "Memory Size:"
msg_cyles:.byte 13,10.ascii "Cyls:"
msg_heads:.byte 13,10.ascii "Heads:"
msg_sectors:.byte 13,10.ascii "Sectors:"
msg_kb:.ascii "KB".org 510
boot_flag:.word 0xAA55

实现效果

在这里插入图片描述

  相关解决方案