当前位置: 首页 > news >正文

第5章 虚拟机的安装和使用

第5章 虚拟机的安装和使用

从本章开始,按照书籍的划分,第5章到第9章就进入实模式部分。关于实模式,我也建议阅读王爽的《汇编语言》,就是王爽的《汇编语言》采用的MASM编译器,风格和本书的NASM风格不太一样,知识点都是差不多的。

因为之前我有读过王爽的汇编语言,所以这几章相对来讲还是容易理解。

计算机的启动过程

如何将编译好的程序提交给处理器

该小结主要介绍了在不同的操作系统上,可执行文件都要按照操作系统的规定,在文件的开始部分增加编译日期、版本等信息,方便操作系统识别并执行。

但是在上一个章节有提到,通过 NASM 编译器编译的二进制文件是纯纯的机器语言(Machine Language)代码,没有加入任何操作系统的规定内容,所以是无法在操作系统上运行的。既然是纯纯的机器语言,那么直接让计算机执行

画个图就比较清楚了:

image

我们编写的汇编程序层级

从层级上来看,操作系统是封装的底层硬件设备的操作,并提供API给应用程序层使用。想想我们编写的汇编程序也是直接操作硬件设备,那么就可以直接让计算机执行了。

计算机的加电和复位

既然要让计算机执行我们编写的汇编程序,那要怎么执行呢?计算机执行程序的原理是什么?

本小节中介绍了计算机的加电和复位的原理,同时介绍了内存的特点,为后续小节基本输入输出系统做铺垫。

一些知识点:

  • 计算机加电和复位(Reset),CPU内寄存器会回复到初始状态。
  • 内存全称动态随机访问存储器(Dynamic Random Access Memory,DRAM),断电丢失数据

总结来看就是:不管计算机加电还是复位初始,内存中都没有数据,那么计算机从哪里开始执行指令?

基本输入输出系统

既然内存断电就没有数据,那么有没什么存储器可以长期存储程序,计算机启动的时候可以从这里开始执行指令?这个就是ROM(Read Only Memory)。

该小节介绍了ROM存储器和存储在ROM内的基本输入输出系统BIOS(Base Input Out System)。

一些知识点:

  • 8086 CPU 20根地址线的地址不全分配给内存,也分配给ROM-BIOS和其他设备。
  • 计算机一开始执行的时候就是从ROM开始执行的。
  • BIOS基础指令执行完成后,就可以通过 jmp 指令跳转到其他地方执行。

画了个示例图就更加容易理解了。

image

8086 CPU地址线分配

硬盘及其工作原理

书中介绍了硬盘的机械结构,而后引出了磁道(Track)、柱面(Cylinder)、扇区(Sector)、磁头(Head)概念。

书中是给二维的图,没有标注柱面,以前刚接触硬盘结构的时候也是头晕,自己尝试画了个立体的:

image

磁盘示例图

涉及到立体的样子,比较难画,各位看官蛮看看,意思能看明白就行。

磁盘读取数据是根据柱面(Cylinder)、磁头(Head)、扇区(Sector)进行读取的,简称CHS

  • 柱面定位盘片上的圆环,编号从0开始。
  • 磁头定位哪个盘片上的圆环,编号从0开始。
  • 扇区定位圆环上的圆弧,编号从1开始。

每次读取以扇区为单位进行读取,扇区包括:

  • 扇区头:每个扇区自己的信息,主要有磁道号、磁头号和扇区号等。
  • 数据区:512字节。

因为这种读取数据的方式比较复杂,后面都是用LBS(Logical Block Addressing),就是用逻辑地址对应CHS地址,这样就比较简单,书籍后面也有介绍,这里不多说了。

虽然现在固态硬盘大行其道,但是因为磁盘容量大、价格便宜,再加上保存时间久,所以也还是挺有市场的,适当了解还是有必要的哈。

一切从主引导扇区开始

该小节介绍了主引导扇区MBR(Master Boot Record)的概念和作用。

主引导扇区的概念:磁盘的第一个扇区(0柱0头1扇区),称为引导扇区。

书中第一个扇区叫法为 0面0道1扇区 和 0头0柱1扇区。
但个人更喜欢用 0柱0头1扇区 的方式,因为符合CHS的顺序。

主引导扇区的作用:计算机执行时,ROM-BIOS会从引导扇区读取内容,加载到内存地址0x7c00,而后处理器就从这里开始运行。

为什么是0x7c00?网上找到一篇文章,链接见文末,姑且了解下,大意就是说:

  • 早期的内存都是16KB、32KB、48KB和64KB。
  • 从软盘启动所需的最小内存量是32KB,软盘的第一个扇区会被加载到内存接近32KB末尾但稍微靠前的位置。32KB的地址就是0x8000。
  • 0x0500-0x7bff,BIOS至少会使用其中的一个字节作为打印屏幕标志。要避开这个区域,就用0x7c00了。

读完这个章节后,发现书籍并没有总结计算机的启动过程,于是自己总结了一下。

image

8086处理器加电启动过程
  1. 计算机启动后从ROM-BIOS开始执行。
  2. ROM-BIOS从磁盘主引导扇区读取内容并存入到内存0x7c00开始处。
  3. 跳转到0x7c00开始执行。

而后就是主引导程序的事情了。
实际计算机的启动过程会更加复杂,比如现在有UEFI替代BIOS,另外可以设置启动盘等,这里的总结更多是针对8086处理器的启动总结。

创建和使用虚拟机

别害怕,虚拟机是软件

该小节主要介绍了虚拟机(Virtual Machine, VM)的概念和用途。

概念:虚拟机是一款软件,用来模拟计算机的。

用途:研制防病毒软件、测试最新的系统、双系统、教学、学习用等。

我以前学习Linux的时候,就是用虚拟机来安装Linux进行学习的。后来Linux用熟练了,就把宿主机换成了Linux,因为有些软件在Linux上没有,又安装了个虚拟机装了个windows用。太囧了。

下载和安装Oracle VM VirtualBox

该小节主要介绍了虚拟机的安装和使用。

Virtual Box官网:https://www.virtualbox.org/

作者提供了另外一个文档来专门说明虚拟机的安装,照着操作即可了,主要注意点就是虚拟硬盘要选择 VHD(Virtual Hard Disk) 格式。

image

虚拟硬盘简介

该小节介绍了 VHD 文件的数据格式以及为什么要使用VHD文件格式和固定尺寸的原因。

根据书中介绍的数据格式,绘制如下图,方便理解:

image

VHD文件格式

备注:书中用0面0道n扇区的方式表达,个人不太适应,所以改成上图格式,其中:柱对应书中说的道;头对应书中说的面;

为什么要使用VHD文件格式和固定尺寸:因为VHD格式比较简单,通过前面章节可以知道我们的程序要运行就要写入虚拟磁盘,VHD格式容易写入。VirtualBox虚拟机也支持VHD格式。

练习使用FixVhdWr工具向虚拟硬盘写数据

该小节作者介绍了自己编写的虚拟硬盘写入工具 FixVhdWr 和 LBA(Logical Block Address)逻辑块地址。

FixVhdWr软件打开截图:

image

VHD 写入工具

膜拜一下大佬,确实牛B。

LBA:CHS模式读取磁盘比较复杂,用LBA比较简单。根据书中说明,每个LAB逻辑扇区对应着CHS一个扇区。

image

LBA逻辑扇区对应CHS扇区

CHS需要3个参数才能定位具体的扇区,LBA只要1个逻辑扇区号即可。

书中给出了LBA的计算公式,摘录在此:

LBA = C*磁头总数*每道扇区数+H*每道扇区数+(S-1)其中:C:柱面(多个同位置的磁道构成柱面)H:磁头S:扇区号

本章习题

  1. 第1题

照着书本敲代码:
image

  1. 第2题

进入代码目录编译:

$ nasm -f bin .\demo.asm -o .\demo.bin -l .\demo.lst

写入虚拟硬盘:

image

将编译好的二进制文件写入到虚拟硬盘主引导扇区
  1. 第3题

使用virtual box运行

image

输出这个表示各种安装配置啥的都OK了。

参考资料

  • [Disk Basic Knowledge] What Is Cylinder-head-sector? - MiniTool Partition Wizard
  • CHS and LBA Hard Disk Addresses - Thomas-Krenn-Wiki-en
  • ibm pc - Why did the BIOS load the MBR at 0x7c00? - Retrocomputing Stack Exchange

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MyBatis-Plus 一、(基础应用)
  • ROS2常用指令
  • 探索ISP自动曝光技术:工作原理与应用(一)
  • IEEE802网络协议和标准
  • 固废检测算法实际应用方案固废检测算法源码解析
  • ChatGPT 3.5/4.0 新手使用手册
  • 如何为你的SEO策略找到竞争对手的关键词
  • 网络安全学习路线图(2024版详解)
  • 快速上手 STL中 map 和 set 的使用
  • CAN的简介
  • 微服务的负载均衡不同的场景应用
  • Is it possible to modify OpenAI environments?
  • 进程的创建、终止
  • 【安全靶场】-DC-7
  • UE赋予某个C++类tick的能力
  • [PHP内核探索]PHP中的哈希表
  • [数据结构]链表的实现在PHP中
  • 【翻译】babel对TC39装饰器草案的实现
  • Java 内存分配及垃圾回收机制初探
  • Javascript Math对象和Date对象常用方法详解
  • java取消线程实例
  • JDK9: 集成 Jshell 和 Maven 项目.
  • js作用域和this的理解
  • Netty 4.1 源代码学习:线程模型
  • Python爬虫--- 1.3 BS4库的解析器
  • Redis在Web项目中的应用与实践
  • v-if和v-for连用出现的问题
  • 从0到1:PostCSS 插件开发最佳实践
  • 分布式熔断降级平台aegis
  • 回顾 Swift 多平台移植进度 #2
  • 机器学习学习笔记一
  • 区块链分支循环
  • 使用putty远程连接linux
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 在weex里面使用chart图表
  • 阿里云ACE认证之理解CDN技术
  • 如何正确理解,内页权重高于首页?
  • 移动端高清、多屏适配方案
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # include “ “ 和 # include < >两者的区别
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #Linux(权限管理)
  • (java)关于Thread的挂起和恢复
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • ./configure、make、make install 命令
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET CLR Hosting 简介
  • .net后端程序发布到nignx上,通过nginx访问
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @PreAuthorize注解
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)