HIT_OS_LAB3 操作系统的引导

操作系统实验三

3.1. 实验目的

  • 熟悉实验环境;
  • 建立对操作系统引导过程的深入认识;
  • 掌握操作系统的基本开发过程;
  • 能对操作系统代码进行简单的控制,揭开操作系统的神秘面纱。

3.2. 实验内容

3.2.1. 改写 bootsect.s 主要完成如下功能:

bootsect.s 可以在屏幕上输出提示信息
输出语句“BDSOS is booting…”
检查bootsect.s,以下代码用于打印信息

ljmp    $BOOTSEG, $_start  
_start:  mov $0x03,%ah  xor %bh,%bh  int $0x10  mov	$24, %cxmov	$0x0007, %bx		# page 0, attribute 7 (normal)#lea	msg1, %bpmov     $msg1, %bpmov	$0x1301, %ax		# write string, move cursorint	$0x10msg1:.byte 13,10.ascii "Loading system ...".byte 13,10,13,10 
.org 510  
boot_flag:  .word   0xAA55  

因此,对bootsect.s的内容进行修改,使其输出所需的信息,然后删除其余代码,最终,bootsect.s的完整内容如下:

.code16  
.global _start   
.equ SETUPLEN, 4		# nr of setup-sectors  
.equ BOOTSEG, 0x07c0		# original address of boot-sector  
.equ INITSEG, 0x9000		# we move boot here - out of the way  
.equ SETUPSEG, 0x9020		# setup starts here  
.equ ROOT_DEV, 0x301  
ljmp    $BOOTSEG, $_start  
_start:  mov $0x03,%ah  xor %bh,%bh  int $0x10  mov $31,%cx  mov $0x0007,%bx  mov $msg1,%bp  mov $0x07c0,%ax  mov %ax,%es  mov $0x1301,%ax  int $0x10  
msg1:  .byte 13,10  .ascii "WangWeiOS is booting..."  .byte 13,10,13,10  
.org 510  
boot_flag:  .word   0xAA55 

最后,编译文件并执行,结果如下图,显示bootsect.s的修改是正确的,成功输出语句“BDSOS is booting…”
在这里插入图片描述

3.2.2. 改写 setup.s 主要完成如下功能:

首先,确保setup.s能够向屏幕输出信息,这个功能已经在前一个问题中在bootsect.s中完成,因此,将相应代码复制到setup.s中,然后删除多余代码,完整的setup.s代码如下:

       .code16.equ SETUPSEG, 0x9020.global _startljmp $SETUPSEG, $_start	_start:mov $0x03,%ahxor %bh,%bhint $0x10mov $25,%cxmov $0x0007,%bxmov $msg2,%bpmov $0x07c0,%axmov %cs,%axmov %ax,%esmov $0x1301,%axint $0x10inf_loop:jmp inf_loopmsg2:.byte   13,10.ascii "Now we are in SETUP".byte   13,10,13,10.org 510boot_flag:.word   0xAA55

接下来,对bootsect.s进行修改,以使其能够加载并跳转到setup.s的起始地址执行。检查原bootsect.s的内容,找到以下代码实现了这个功能:

        load_setup:mov	$0x0000, %dx		# drive 0, head 0mov	$0x0002, %cx		# sector 2, track 0mov	$0x0200, %bx		# address = 512, in INITSEG.equ    AX, 0x0200+SETUPLENmov     $AX, %ax		# service 2, nr of sectorsint	$0x13			# read itjnc	ok_load_setup		# ok - continuemov	$0x0000, %dxmov	$0x0000, %ax		# reset the disketteint	$0x13jmp	load_setupok_load_setup:ljmp	$SETUPSEG, $0

因此,对bootsect.s的代码进行修改,首先加载setup.s,然后显示语句“WangWeiOS is booting…”,最后跳转至setup.s。完成这些功能并删除多余代码后,bootsect.s的完整代码如下:

   	.code16.equ SETUPLEN, 2		# nr of setup-sectors.equ BOOTSEG, 0x07c0		# original address of boot-sector.equ INITSEG, 0x9000		# we move boot here - out of the way.equ SETUPSEG, 0x9020		# setup starts here.equ ROOT_DEV, 0x301ljmp    $BOOTSEG, $_start_start:mov	$BOOTSEG, %axmov	%ax, %dsmov	$INITSEG, %axmov	%ax, %esmov	$256, %cxsub	%si, %sisub	%di, %direp	movswload_setup:mov	$0x0000, %dx		# drive 0, head 0mov	$0x0002, %cx		# sector 2, track 0mov	$0x0200, %bx		# address = 512, in INITSEG.equ    AX, 0x0200+SETUPLENmov     $AX, %ax		# service 2, nr of sectorsint	$0x13			# read itjnc	ok_load_setup		# ok - continuemov	$0x0000, %dxmov	$0x0000, %ax		# reset the disketteint	$0x13jmp	load_setupok_load_setup:mov	$0x03, %ah		# read cursor posxor	%bh, %bhint	$0x10mov	$31, %cxmov	$0x0007, %bx		# page 0, attribute 7 (normal)mov     $msg1, %bpmov	$0x1301, %ax		# write string, move cursorint	$0x10ljmp	$SETUPSEG, $0msg1:.byte 13,10.ascii "WangWeiOS is booting...".byte 13,10,13,10.org 508root_dev:.word ROOT_DEVboot_flag:.word 0xAA55

最后,编译文件并执行,结果如下图,bootsect.s和setup.s的修改是正确的,成功显示语句“Now we are in SETUP”
在这里插入图片描述

setup.s 可以获取至少一个基本的硬件参数(如内存参数、显卡参数、硬盘参数等),将其存储在内存的特定地址,并在屏幕上输出。
在保持setup.s原有功能不变的同时,使其能够读取硬件参数。首先,在原setup.s文件中,有以下代码可以读取各项硬件信息:

        mov	$INITSEG, %ax	# get Cursor Posermov	%ax, %dsmov	$0x03, %ah	xor	%bh, %bhint	$0x10		mov	%dx, %ds:0      # get Memory Sizemov	$0x88, %ah int	$0x15mov	%ax, %ds:2mov	$0x0000, %ax        # get hd0 datamov	%ax, %dslds	%ds:4*0x41, %simov	$INITSEG, %axmov	%ax, %esmov	$0x0004, %dimov	$0x10, %cxrepmovsb

但是,读取出的数以无符号整数形式存在,需要对这些数进行处理,以十六进制形式显示。可以通过以下函数完成这个操作:

       print_hex:mov    $4,%cxprint_digit:rol    $4,%dxmov    $0xe0f,%ax  and    %dl,%al  add    $0x30,%alcmp    $0x3a,%aljl     outp  add    $0x07,%al  outp:int    $0x10loop   print_digitretprint_nl:mov    $0xe0d,%axint    $0x10mov    $0xa,%alint    $0x10ret

然后,结合以上两点信息,使setup.s在显示"Now we are in SETUP"之后,进一步打印"Memory Size:"、内存大小、“KB”、"Cursor Poser:"等信息,以满足要求。完整的setup.s代码如下:

       .code16.equ SETUPSEG, 0x9020	# this is the current segment.equ INITSEG, 0x9000	# we move boot here - out of the way.global _startljmp $SETUPSEG, $_start	_start:mov $0x03,%ah       # print "Now we are in SETUP"xor %bh,%bhint $0x10mov $25,%cxmov $0x0007,%bxmov $msg2,%bp       mov $0x07c0,%axmov %cs,%axmov %ax,%esmov $0x1301,%axint $0x10mov	$INITSEG, %ax	# get Cursor Posermov	%ax, %dsmov	$0x03, %ah	xor	%bh, %bhint	$0x10		mov	%dx, %ds:0mov	$0x88, %ah      # get memory sizeint	$0x15mov	%ax, %ds:2mov $0x03,%ah       # print "Memory Size:"xor %bh,%bhint $0x10mov $12,%cxmov $0x0007,%bxmov $msg3,%bpmov $0x1301,%axint $0x10mov	%ds:2 , %dx     # print memory sizecall print_hexmov $0x03,%ah       # print "KB"xor %bh,%bhint $0x10mov $2,%cxmov $0x0007,%bxmov $msg4,%bpmov $0x1301,%axint $0x10call print_nl mov $0x03,%ah       # print "Memory Size:"xor %bh,%bhint $0x10mov $12,%cxmov $0x0007,%bxmov $msg8,%bpmov $0x1301,%axint $0x10mov	%ds:0 , %dx     # print memory sizecall print_hexcall print_nlmov $0x03,%ah       # print "Cylinders:"xor %bh,%bhint $0x10mov $10,%cxmov $0x0007,%bxmov $msg5,%bpmov $0x1301,%axint $0x10mov	$0x0000, %ax        # get hd0 datamov	%ax, %dslds	%ds:4*0x41, %simov	$INITSEG, %axmov	%ax, %esmov	$0x0004, %dimov	$0x10, %cxrepmovsbmov	$INITSEG, %ax       # print Cylindersmov	%ax, %dsmov	%ds:4 , %dx     call print_hexcall print_nlmov $0x03,%ah       # print "Headers:"xor %bh,%bhint $0x10mov $8,%cxmov $0x0007,%bxmov $msg6,%bp       mov $0x07c0,%axmov %cs,%axmov %ax,%esmov $0x1301,%axint $0x10mov	$INITSEG, %ax       # print Headersmov	%ax, %dsmov	%ds:6 , %dx     call print_hexcall print_nlmov $0x03,%ah       # print "Sectors Per Track:"xor %bh,%bhint $0x10mov $18,%cxmov $0x0007,%bxmov $msg7,%bpmov $0x1301,%axint $0x10mov	$INITSEG, %ax       # print Sectors Per Trackmov	%ax, %dsmov	%ds:18 , %dx     call print_hexcall print_nlinf_loop:jmp inf_loopprint_hex:mov    $4,%cxprint_digit:rol    $4,%dxmov    $0xe0f,%ax  and    %dl,%al  add    $0x30,%alcmp    $0x3a,%aljl     outp  add    $0x07,%al  outp:int    $0x10loop   print_digitretprint_nl:mov    $0xe0d,%ax   int    $0x10mov    $0xa,%al    int    $0x10retmsg2:.byte   13,10.ascii "Now we are in SETUP".byte   13,10,13,10msg3:.ascii "Memory Size:"msg4:.ascii "KB"msg5:.ascii "Cylinders:"msg6:.ascii "Headers:"msg7:.ascii "Sectors Per Track:"msg8:.ascii "Cursor Pose:".org 510boot_flag:.word   0xAA55

最后,编译文件并执行,结果如下图。
在这里插入图片描述

  • 成功显示信息“Memory Size:3C00KB”。表明3C00KB即为15MB,又有15MB+1MB=16MB。查看bochs配置文件bochs/bochsrc.bxrc,发现有"megs: 16",则配置的bochs为16MB内存,所以这项信息正确。
  • 成功显示信息“Cursor Poser:1800”,光标位置为1800,也是正确的。
  • 成功显示信息“Cylinders:00cc”、“Headers:0010”、“Sectors Per Track:0026”。查看bochs配置文件bochs/bochsrc.bxrc,发现有“ata0-master: type=disk, path=“$OSLAB_PATH/hdc-0.11.img”, mode=flat, cylinders=204, heads=16, spt=38”,设定的cylinders=204=0x00CC,heads=16=0x0010,spt(Sectors Per Track)=38=0x0026,与所显示的信息相符,因此这几项信息也是正确的。

3.3. 实验报告

有时,继承传统意味着别手蹩脚。 x86 计算机为了向下兼容,导致启动过程比较复杂。 请找出 x86 计算机启动过程中,被硬件强制,软件必须遵守的两个“多此一举”的步骤(多找几个也无妨),说说它们为什么多此一举,并设计更简洁的替代方案。

实模式和保护模式切换:

  • 初始时,x86处理器以实模式运行,这是旧版处理器的工作模式。为了支持现代操作系统,处理器在启动后需要切换到保护模式。这一切换包括加载新的段描述符、设置新的全局描述符表(GDT)和禁用一些过时的实模式特性。
  • 实模式是为老软件和硬件设计的,而保护模式提供更强大和安全的特性。然而,切换过程增加了启动的复杂性,而在现代系统中,实模式的许多特性是多余的。
  • 直接从启动时开始在保护模式下运行,省略实模式和保护模式的切换,以简化启动过程。

BIOS中断调用:

  • 在启动过程中,操作系统通常需要与硬件交互。在x86中,传统方式是通过调用BIOS中断请求服务,例如,读取键盘输入、显示字符等。这导致了对中断向量表的依赖,增加了复杂性。
  • 随着计算机硬件和操作系统的发展,直接调用硬件驱动程序或使用更现代的接口方式可以更高效地进行硬件交互。
  • 直接使用现代的硬件抽象层和驱动程序模型,避免对BIOS中断的依赖。通过在内核中嵌入适当的驱动程序,而不是依赖BIOS中断调用,可以更为简洁地实现相同的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/187539.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3使用vue-print-nb插件打印功能

插件官网地址https://www.npmjs.com/package/vue-print-nb 效果展示: 打印效果 根据不同的Vue版本安装插件 //Vue2.0版本安装方法 npm install vue-print-nb --save pnpm install vue-print-nb --save yarn add vue-print-nb//Vue3.0版本安装方法: npm install vue3…

ArcGIS进阶:水源涵养功能分级评价操作

首先抛出水源涵养重要性评价的公式:水源涵养量降雨量-蒸散发量-地表径流量,其中地表径流量降雨量*平均地表径流系数 声明:以下数据来源于来自于牛强老师书籍(城乡规划GIS技术)。 以下给出重要性评价阈值表&#xff1…

linuxC语言缓冲区及小程序的实现

文章目录 1.文件缓冲区1.1介绍1.2缓冲文件系统1.3冲刷函数fflush1.4认识linux下的缓冲区 2.linux小程序的实现2.1 回车\r和换行\n2.2倒计时程序2.3进度条小程序sleep/usleep代码运行结果 1.文件缓冲区 1.1介绍 为缓和 CPU 与 I/O 设备之间速度不匹配,文件缓冲区用以…

玄子Share-HTML5知识手册

玄子Share-HTML5知识手册 前言: 这一版 HTML 笔记,算是我写的第四版了,第三版对照课本编写,第四版则是对照 MDN 官方文档编写,不论是术语亦或专业性,都更上一层 文章依托 MDN 文档,拓展了大量课…

基于SSM的汽车在线租赁管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

skynet学习笔记02— skynet介绍、skynet基础API与环境变量

01、Skynet与Actor模型 在系统Skynet之前,先了解一下Skynet与Actor模型,下列是风云大佬的介绍以及一个大佬的博客 https://github.com/cloudwu/skynet/wiki/GettingStartedhttps://blog.csdn.net/qq769651718/article/details/79432793 02、Skynet基础…

11.7加减计数器,可置位~,数字钟分秒,串转并,串累加转并,24位串并128,流水乘法器,一些乘法器

信号发生器 方波,就是一段时间内都输出相同的信号 锯齿波就是递增 三角波就是先增后减 加减计数器 当mode为1则加,Mode为0则减;只要为0就输出zero 这样会出问题,因为要求是十进制,但是这里并没有考虑到9之后怎么办&a…

Python编程——模块、包和__init__.py

1. 模块 Python中的一个文件即为一个模块(Module)&#xff0c;一个模块引用另外一个模块的变量、函数或类时&#xff0c;使用import来导入。模块名即文件名。 如fibo.py 文件下有如下代码&#xff1a; def fib(n): # write Fibonacci series up to na, b 0, 1while a <…

18 Linux 阻塞和非阻塞 IO

一、阻塞和非阻塞 IO 1. 阻塞和非阻塞简介 这里的 IO 指 Input/Output&#xff08;输入/输出&#xff09;&#xff0c;是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候&#xff0c;如果不能获取到设备资源&#xff0c;那么阻塞式 IO 就会将对应应用…

作业提交产品的爽点、痛点和痒点分析以及开源软件介绍

目录 1 爽点1.1 什么是爽点1.2 如何构成爽点1.3 案例 2 痛点2.1 什么是痛点2.2 如何构成痛点2.3 案例分析 3 痒点3.1 什么是痒点3.2 如何构成痒点3.3 案例分析 4 开源软件Canvas LMS4.1 链接地址4.2 简介4.3 特点和功能4.4 功能展示图片 1 爽点 1.1 什么是爽点 即时满足&#…

基于SSM的网络音乐系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

将 ONLYOFFICE 文档编辑器与 С# 群件平台集成

在本文中&#xff0c;我们会向您展示 ONLYOFFICE 文档编辑器与其自有的协作平台集成。 ONLYOFFICE 是一款开源办公套件&#xff0c;包括文本文档、电子表格和演示文稿编辑器。这款套件支持用户通过文档编辑组件扩展第三方 web 应用的功能&#xff0c;可直接在应用的界面中使用。…

深度学习(生成式模型)——Classifier Guidance Diffusion

文章目录 前言问题建模条件扩散模型的前向过程条件扩散模型的反向过程条件扩散模型的训练目标 前言 几乎所有的生成式模型&#xff0c;发展到后期都需要引入"控制"的概念&#xff0c;可控制的生成式模型才能更好应用于实际场景。本文将总结《Diffusion Models Beat …

TortoiseSVN 状态图标不显示的两种解决办法

文章目录 TortoiseSVN 方式解决注册表方式解决 TortoiseSVN 方式解决 在桌面或者资源管理器中鼠标右键打开 TortoiseSVN 设置选择 Icon Overlays (图标覆盖)Status cache&#xff08;状态缓存&#xff09; 选择 ‘Shell’ 选择 Icon Overlays&#xff08;图标覆盖&#xff09;…

uniapp和vue3+ts开发小程序,使用vscode提示声明变量冲突解决办法

在uniapp中&#xff0c;我们可能经常会遇到需要在不用的环境中使用不同变量的场景&#xff0c;例如在VUE3中的小程序环境使用下面的方式导入echarts&#xff1a; const echarts require(../../static/echarts.min); 如果不是小程序环境则使用下面的方式导入echarts&#xff…

MobaXterm 安装+使用

目录 1 下载安装 1.1 官网下载(速度慢) 1.2 WebRA下载(不是最新版) 2 常用功能 2.1 基础设置 2.2 常用功能 1 下载安装 1.1 官网下载(速度慢) 点击MobaXterm官网,按下图↓↓步骤下载 1.2 WebRA下载(不是最新版) 点击WebRA网址,按下图↓↓步骤下载 2 常用功能 2.1 基础设…

科普测量开关电源输出波形的三种方法及电源波形自动化测试步骤

开关电源波形测试就是对开关电源的输出波形进行检测和分析&#xff0c;观察开关电源参数变化&#xff0c;以此来判断开关电源的性能是否符合要求。好的开关电源对于设备以及整个电路的正常运行是非常重要的&#xff0c;因此开关电源输出波形测试是开关电源测试的重要环节&#…

python调用chrome实现网页自动操作

一. 内容简介 python调用chrome实现网页自动操作。 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a; 三.主要流程 3.1 下载驱动和插件 调用谷歌浏览器&#xff0c;需要下载浏览器驱动&#xff08;https://registry.npmmirror.co…

conda修改虚拟环境名称

conda 修改虚拟环境名称 conda 不能直接更改名称&#xff0c;但是可以通过克隆环境解决 新建环境&#xff08;克隆旧环境&#xff09; conda create --name 新环境名 --clone 旧环境名 删除原环境 conda remove --name 旧环境名 --all 查看现有环境 conda env list conda i…

PMCW体制雷达系列文章(1) – PMCW体制雷达综述

说明 相位调制连续波(Phase-modulated continuous wave, PMCW)雷达&#xff0c;或又被称为数字雷达&#xff0c;近年来开始被应用于汽车雷达领域。而且因其特有的一些优势(精度高、抗干扰能力强等)被认为是车载毫米波雷达的发展趋势之一(从目前占主导的调频连续波(Frequency-mo…