《操作系统真象还原》 第 01 章 部署工作环境 学习笔记

news2024/12/28 20:05:16

0. 内容说明

  • 本内容依据《操作系统真象还原》进行学习,在学习过程中,由于新版本和旧版本bochs存在参数差异,故此会出现一些调试错误。也记录对应的解决方案。

1. 需要的编译器

对于现代OS来说,主要使用 C语言汇编语言 两种语言。

所以主要选择对应两种语言的编译器:

  • C语言:gcc编译器
  • 汇编语言:nasm。

选择理由:开源。

1.1 gcc编译器

GNU编译器套装(GNU Compiler Collection,GCC),是GNU开发的编程语言编译器。

在Linux环境部署过程中,直接使用对应OS的指定指令去安装对应的gcc编译器即可。

1.2 nasm编译器

NASM是为了可移植性与模块化而设计的一个80x86的汇编器。支持不同的目标文件格式。

使用汇编语言开发OS的原因:

  • 需要与硬件直接打交道。
  • 处理的代码逻辑需要兼顾硬件的多样性,以及对硬件进行直接指令操作。

2. OS的宿主环境

OS归属于软件,但不是一般的软件。程序本身需要依赖于OS支持。

2.1 虚拟机相关的概念

虚拟机就是通过软件来模拟硬件。

虚拟机就是一个模拟了硬件资源的普通进程。对于虚拟机中的操作,都是需要通过虚拟机的检查,然后代为向OS提交操作请求。

使用虚拟机的原因:

  • 运行方便

    • 在宿主机系统上就是一个用户进程。
    • 对于进程可以随意启动,虚拟机也是如此。
  • 保护主体计算机

    • 代码崩溃时,可以及时重启计算机。
    • 避免宿主机重启太多次。

对于虚拟机来说,有很多的选择,一般有 qemu、bochs、virtualBox、xen 和 Vmware等等。但是虚拟机的选择来说,就是能工作、调试、够用足矣。

2.2 virtualBox环境准备

关于VirtualBox安装部署虚拟机的步骤,请参考详细文章,不再过多赘述。

参考文章:https://www.debugpoint.com/install-ubuntu-windows-virtualbox/

工具平台下载地址
Oracle VirtualBoxhttps://www.virtualbox.org/wiki/Downloads
Ubuntu 20.04 iso 镜像文件https://releases.ubuntu.com/focal/

ubuntu中安装gcc编译器方式:

sudo apt-get install gcc g++ make nasm -y # 后续编译bochs时需要

由于我使用的是USB的方式,在virtual1Box中会出现如下报错方式:

  • 不能分配USB设备到虚拟电脑

    • 解决方案:到链接:https://download.virtualbox.org/virtualbox/ 中找到对应virtualBox版本的扩展插件。由于我使用的是 6.1.46版本,可以下载如下结尾的文件。

      在这里插入图片描述

      • 文件下载完成后,进行插件的配置。第三步时找到自己下载的插件进行加载即可。

      在这里插入图片描述

      • 在完成插件配置之后,进行USB接口的设置。

      在这里插入图片描述

2.3 Boches相关准备

Bochs是一个LGPL源代码许可协议的x86、x86-64IBM、PC兼容机模拟器和调试工具。支持处理器(包括保护模式)、内存、硬盘、显示器、以太网、BIOS、IBM PC

Bochs下载地址(本人使用的版本:2.6.11):https://sourceforge.net/projects/bochs/files/bochs/2.6.11/

下载文件完成后,开始解压并进行编译过程。

tar -xvf bochs-2.6.11.tar.gz

cd bochs-2.6.11

# 开始使用如下命令开始编译
./configure \
--prefix=/data/bochs \
--enable-debugger \
--enable-disasm \
--enable-iodebug \
--enable-x86-debugger \
--with-x \
--with-x11

# 编译完成后,可以使用如下命令安装
make install

对于编译参数的说明:

  • --prefix=/data/bochs:指定bochs的安装目录
  • --enable-debugger:打开bochs自己的调试器。看自己的选择,也可以使用远程gdb调试器(参数:--enable-gdb-stub
  • --enable-disasm:让bochs支持反汇编
  • --enable-iodebug:支持io接口调试器
  • --enable-x86-debugger:支持x86调试器
  • --with-x:使用x window
  • --with-x11:使用x11图形用户接口

由于我试着编译了两个版本:bochs自己的调试器gdb调试器。出现过如下错误:

  • gdb调试器版本出现的错误

    在编译过程中会出现如下错误,是因为在configure文件执行过程中就已经找不到x11文件库。

    可以使用如下命令方式(参考链接:https://ubuntuforums.org/showthread.php?t=1843305) :

    在这里插入图片描述

    sudo apt-get install libx11-dev -y
    

    在解决问题后,又会出现如下错误:

    install: cannot stat './bochsdbg': No such file or directory
    

    在这里插入图片描述

    解决方案:

    # 在编译的当前文件目录中,修改文件的名字
    cd bochs-2.6.11
    cp bochs bochsdbg
    

    再次重新编译即可。

  • bochs自己的调试器 编译时出现的错误

    • 由于先编译 gdb远程调试器的版本,目前未发现错误。

2.4 配置Bochs

进入安装目录进行配置 bochs.disk 文件。使用 .disk 区分启动文件。

由于存在版本的差异,有些参数在最新版本无法使用,可以根据后续错误解决方案进行分析解决。

# 设置Bochs在运行过程中能够使用的内存
# 关键字:megs

megs: 32

# 设置对应真实机器的BIOS 和 VGA BIOS
# 对应的关键字:romimage 和 vgaromimage

romimage: file=/data/bochs-debugger/share/bochs/BIOS-bochs-latest
vgaromimage: file=/data/bochs-debugger/share/bochs/VGABIOS-lgpl-latest

# 设置bochs所使用的磁盘,软盘的关键字未floppy。
# 若只有一个软盘,则使用 floppya即可,若有多个,则为 floppya,floppyb...
# floppya:  1_44=a.img, status=inserted


# 选择启动盘符
# boot: floppy      # 默认从软盘启动,将其注释
boot: disk          # 改为硬盘启动。任何代码都将直接写在硬盘上,所以不会再有读写软盘的操作。

# 设置日志文件的输出
log: bochs.out

# 开启或关闭某些功能
# 下面是关闭鼠标,并关闭键盘
mouse: enabled=0
keyboard_mapping: enabled=1,
map=/data/bochs-debugger/share/bochs/keymaps/x11-pc-us.map

# 硬盘设置
ata0:enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14

# 增加的bochs对gdb的支持,使得gdb可以远程连接到此机器的1234端口进行调试
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0

2.5 运行Bochs

  • 进入 bochs的安装目录,然后启动执行文件。默认提示选择符为2。

    在这里插入图片描述

  • 直接键入Enter,然后再输入配置文件:bochs.disk ,等待默认提示符变成[6],说明可以开始进行模拟。
    在这里插入图片描述

2.6 运行bochs的过程中出现错误

在加载配置文件的过程中,出现如下错误PANIC的原因:
在这里插入图片描述

解决方案:通过bochs提供的工具 ./bximage 进行创建虚拟硬盘。

查看工具支持的信息如下:

在这里插入图片描述

./bximage -hd=60M -mode="create" -q hd60M.img

创建成功后,显示如下:

在这里插入图片描述

在创建虚拟硬盘成功后,直接将 ata0-master 这一行的内容复制硬盘设置的那一行。注释掉原来的硬盘。

# 硬盘设置
# ata0:enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="hd60M.img", mode=flat

在直接使用 ./bochs/bochs -f bochsrc.disk 指令后,出现了语法上的错误:

>>PANIC<< bochsrc.disk:27: keyboard directive malformed.

在这里插入图片描述

查看了官网对keyboard的最新版本(https://bochs.sourceforge.io/doc/docbook/user/bochsrc.html)设置格式。直接修改为如下内容:

keyboard: keymap=/data/bochs-debugger/share/bochs/keymaps/x11-pc-us.map

后续会出现 >>PANIC<< bochsrc.disk:34: Bochs is not compiled with gdbstub support ,原因:在编译时,没有对远程gdb调试器进行编译。对于该问题解决方案就是直接将 配置文件中的 gdbstub一行 注释掉即可。

在进行成功加载后显示提示符[6]时,直接enter后,也会出现如下的错误:

在这里插入图片描述

解决方案:修改配置文件内容,将其path指定为绝对路径即可。

ata0-master: type=disk, path="/data/bochs-debugger/bin/hd60M.img", mode=flat

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剑指offer——JZ26 树的子结构 解题思路与具体代码【C++】

一、题目描述与要求 树的子结构_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入两棵二叉树A&#xff0c;B&#xff0c;判断B是不是A的子结构。&#xff08;我们约定空树不是任意一个树的子结构&#xff09; 假如给定A为{8,8,7,9,2,#,#,#,#,4,7}&#xff0c;B为{8,9,2}&…

【智能家居项目】裸机版本——字体子系统 | 显示子系统

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 今天实现上图整个项目系统中的字体子系统和显示子系统。 目录 &#x1f004;设计思路&#x1…

无法启动此程序,因为计算机中“找不到msvcp140.dll”的解决方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个动态链接库文件&#xff0c;它是许多基于Visual Studio开发的应用程序和游戏的必要组件。当计算机上缺失msvcp140.dll文件时&#xff0c;可能会导致以下问题&#xff1a; 1. 程序无法启动&#xff0c;提示“找不到…

【多线程安全】死锁 锁竞争总结

下面有两段代码&#xff1a; public class test {private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {for (int i 0; i < 10000; i) {count;}});Thread t2 new Thread(() -> {for (i…

速通Redis基础(一):掌握Redis的字符串类型和命令

目录 字符串&#xff08;String&#xff09; 常见命令 SET GET MSET&MGET SETNX INCR INCRBY DECR DECRBY INCRBYFLOAT APPEND GETRANGE SETRANGE STRLEN Redis字符串类型命令总结 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的…

机器学习基础之《分类算法(8)—随机森林》

一、什么是集成学习方法 1、定义 集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型&#xff0c;各自独立地学习和作出预测。这些预测最后结合成组合预测&#xff0c;因此优于任何一个单分类的做出预测 谚语&#xff1a;三个臭皮匠顶个诸…

论文悦读(6)——PM操作系统之TreeSLS单级存储

TreeSLS &#xff08;SOSP23&#xff09; 1. 背景 (Background)1.1 内存-存储二级架构 (1, 2.1)1.2 单级架构 (2.2)1.3 总结 2. 动机 (Motivation)2.1 现有SLS性能低下 (2.3)2.2 现有SLS难以支持External Synchrony (1, 2.4)2.3 高速PM出现为SLS带来新的机遇与挑战 (1, 2.5) 3.…

CDN是什么?(网络零基础入门篇)

1.CDN的全称 是 Content Delivery Network&#xff0c;即内容分发网络。 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。 通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网…

探索古彝文的秘密,AI实现古籍传承

陈老老老板&#x1f934; &#x1f9d9;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f9d9;‍♂️本文简述&#xff1a;最新资讯&#xff0c;合合信息扫描全能王实现古彝文识别&…

sigmoid和softmax函数有什么区别

Sigmoid函数和Softmax函数都是常用的激活函数&#xff0c;但它们的主要区别在于应用场景和输出结果的性质。 Sigmoid函数&#xff08;也称为 Logistic函数&#xff09;&#xff1a; Sigmoid函数将输入值映射到0到1之间的连续实数范围&#xff0c;通常用于二元分类问题。 Si…

U-Net神经网络简明教程

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 在我们进入技术细节之前&#xff0c;考虑一下&#xff0c;为什么要使用 U-Net&#xff1f; 你可能在搜索语义分割时遇到过这一点&#xff0c;我很快就会写一篇博客&#xff0c;然后再看看这个。 制作此架构的初衷是用于生物…

Spring MVC程序开发(JavaEE进阶系列3)

目录 前言&#xff1a; 1.什么是Spring MVC 1.1MVC的定义 1.2MVC和Spring MVC的关系 1.3为什么要学习Spring MVC 2.Spring MVC项目的创建 3.Spring MVC框架的使用 3.1连接的功能 3.1.1RequestMapping 3.1.2GetMapping 3.1.3PostMapping 3.2获取参数的功能 3.2.1获…

罗彻斯特大学探讨ChatGPT等人工智能将如何影响高等教育

人工智能聊天机器人ChatGPT持续引起互联网用户的热议&#xff0c;它能够回答关于各个领域的问题&#xff0c;创作歌曲、食谱&#xff0c;起草电子邮件等等。罗切斯特的教职员工和管理人员就他们如何处理 ChatGPT 以及它如何影响未来的教学和学习提出了他们的想法。 “让这项技…

基于Java的新能源汽车在线租赁平台设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

基于ChatGPT快速入门体验NLP词云

基于ChatGPT快速入门体验NLP词云 一、什么是自然语言处理二、自然语言处理和词云的关系三、Python环境准备四、基于ChatGpt制作词云4.1 ChatGPT生成初级词云代码4.2 ChatGPT生成进阶词云代码4.3 基于ChatGPT解决代码问题4.4 基于ChatGPT建议修改问题代码 一、什么是自然语言处理…

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现)

前段时间也是把指针较为详细系统的讲解完毕&#xff0c;接下来介绍一个全新的知识点&#xff0c;就是字符函数和字符串函数 前几期文章可进我主页观看&#xff1a;总之就是非常唔姆_Matlab,经验分享,c语言题目分享-CSDN博客 想要源代码可以去我的github看看&#xff1a;Neros…

教你拥有一个自己的QQ机器人!0基础超详细保姆级教学!基于NoneBot2 Windows端搭建QQ机器人

0.序言 原文链接&#xff1a;教你本地化部署一个QQ机器人本教程主要面向Windows系统用户教程从0开始全程详细指导&#xff0c;0基础萌新请放心食用&#x1f355;如果你遇到了问题&#xff0c;请仔细检查是否哪一步有遗漏。如果你确定自己的操作没问题&#xff0c;可以到原文链…

苹果macbook电脑磁盘满了怎么清理内存

如果你是苹果macbook用户&#xff0c;可能会面临一个常见但又令人头疼的问题——磁盘空间不足。这不仅影响了你的电脑性能&#xff0c;还可能导致新的软件无法安装&#xff0c;甚至影响到文件的保存。好消息是&#xff0c;有多种方法可以有效地解决这个问题。下面就一起来看看吧…

【100个 Unity实用技能】☀️ | UGUI Text中加入超链接文本,可直接点击跳转

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

unity脚本_Input鼠标键盘 c#

获取鼠标坐标 检测鼠标输入 如果在运行游戏场景中点击一下鼠标左键 检测鼠标抬起 选中即可 检测键盘按下 当前屏幕分辨率 注意&#xff1a;获取的是显示器的分辨率 获取设备屏幕宽高 屏幕休眠模式 窗口/全屏模式 移动设备屏幕转向