`
java-mans
  • 浏览: 11457642 次
文章分类
社区版块
存档分类
最新评论

一个操作系统的实现:搭建你的工作环境

 
阅读更多

我知道,现在你已经开始摩拳擦掌准备大干一场了, 你发现,开头并不是那么难的.你可能想到了Linus,或许他在写出第一个引导扇区并调试成功时也是同样的激动不已;你可能在想,有一天,我也要写出一个Linux那样伟大的操作系统!是的,这一切都有可能, 一切伟大必定是从平凡开始的.我知道此刻你踌躇满志,已经迫不及待要进入操作系统的殿堂.

  可是先不要着急,古人云:“工欲善其事,必先利其器”,你可能已经发现,如果每次我们编译好的东西都要写到软盘上,再重启计算机,不但费时费力,对自己的爱机简直是一种蹂躏.你一定不会满足于这样的现状,还好,我们有如此多的工具,比如前面提到过的Bochs.

  在介绍Bochs及其他工具之前,需要说明一点,这些工具并不是不可或缺的,介绍它们仅仅是为读者提供一些可供选择的方法,用以搭建自己的工作环境.但是,这并不代表这一章就不重要, 得心应手的工具不但可以愉悦身心,并且可以起到让工作事半功倍的功效.

  下面就从Bochs开始介绍.

  虚拟计算机Bochs

  即便没有听说过虚拟计算机,你至少应该听说过磁盘映像.如果经历过DOS时代,你可能就曾经用HD-COPY把一张软盘做成一个.IMG文件, 或者把一个.IMG文件恢复成一张软盘.虚拟计算机相当于此概念的外延,它与映像文件的关系就相当于计算机与磁盘.简单来讲,它相当于运行在计算机内的小 计算机.

  1.Bochs初体验

  我们先来看看Bochs是什么样子的,请看这两个屏幕截图:


要看清楚哦,你看到的不是显示器,仅仅是窗口而已.如果你是第一次接触“虚拟机”这个东西的话,一定会感到很惊讶,你会惊叹:“啊,像真的一样!”没错, 像真的一样,不过窗口的标题栏一行“Bochs x86-64 emulator”明白无误地告诉我们,这仅仅是个“emulator”──模拟器而已.在本书中我们把这种模拟器称为虚拟机, 这 个词使用得更广泛一些.不管是模拟还是虚拟,我们要的就是它,有了它,我们不再需要频繁地重启计算机,即便程序有严重的问题,也丝毫伤害不到你的爱机.更 加方便的是,你可以用这个虚拟机来进行操作系统的调试,在它面前,你就好像是上帝,你可以随时让时间停住,然后钻进这台计算机的内部,CPU的寄存器、内 存、硬盘,一切的一切都尽收眼底.这正是进行操作系统的开发实验所需要的.

 好了,既然Bochs这么好,我们就来看看如何安装,以及如何使用.

  2.Bochs的安装

  就像大部分软件一样,在不同的操作系统里面安装Bochs的过程是不同的,在Windows中,最方便的方法就是从Bochs的官方网站获取安 装程序来安装(安装时不妨将“DLX Linux Demo”选中,这样你可以参考它的配置文件).在Linux中,不同的发行版(distribution)处理方法可能不同.比如,如果你用的是 Debian GNU/Linux或其近亲(比如Ubuntu),可以使用这样的命令:

  $ sudo apt-get install vgabios bochs bochs-x bximage

  敲入这样一行命令,不一会儿就装好了.


很多Linux发行版都有自己的包管理机制,比如上面这行命令就是使用了Debian的包管理命令,不过这样安装虽然省事,但有个缺点不得不说,就是默认安装的Bochs很可能是没有调试功能的,这显然不能满足我们的需要, 最好的方法还是从源代码安装,源代码同样位于Bochs的官方网站[1],假设你下载的版本是2.3.5,那么安装过程差不多是这样的:

  $ tar vxzf bochs-2.3.5.tar.gz

  $ cd bochs-2.3.5

  $ ./configure --enable-debugger --enable-disasm

  $ make

  $ sudo make install

  注意“./configure”之后的参数便是打开调试功能的开关.在安装过程中,如果遇到任何困难,不要惊慌,其官方网站上有详细的安装说明.

  3.Bochs的使用

  好了,Bochs已经安装完毕,是时候来揭晓第1章的谜底了,下面我们就一步步来说明图1.1的画面是怎样来的.

  在第1章我们提到过,硬件方面需要的是一台计算机和一张空白软盘,现在计算机有了──就是刚刚安装好的Bochs,那么软盘呢?既然计算机都可 以“虚拟”,软盘当然也可以.在刚刚装好的Bochs组件中,就有一个工具叫做bximage,它不但可以生成虚拟软盘,还能生成虚拟硬盘,我们也称它们 为磁盘映像.创建一个软盘映像的过程如下所示:

  凡是有↩记号的地方,都是bximage提示输入的地方,如果你想使用默认值,直接按回车键就可以.在这里我们只有一个地方没有使用默认值,就是被问到创建硬盘还是软盘映像的时候,我们输入了“fd”.


完成这一步骤之后,当前目录下就多了一个a.img,这便是我们的软盘映像了.所谓映像者,你可以理解为原始设备的逐字节复制,也就是说,软盘的第$M$个字节对应映像文件的第M个字节.

  现在我们已经有了“计算机”,也有了“软盘”,是时候将引导扇区写进软盘了.我们使用dd命令[2]:

 $ dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc

  注意这里多用了一个参数“conv=notrunc”,如果不用它的话软盘映像文件a.img会被截断(truncated), boot.bin比a.img要小.第1章中我们使用这个命令时不需要此参数, 真实的软盘不可能被“截断”──真的和假的总是会有一点区别.

  现在一切准备就绪,该打开电源启动了.可电源在哪儿呢?不要慌,我们还剩一样重要的东西没有介绍,那就是Bochs的配置文件.为什么要有配置文件呢? 你需要告诉Bochs,你希望你的虚拟机是什么样子的.比如,内存多大啊、硬盘映像和软盘映像都是哪些文件啊等内容.不用怕,这配置文件也没什么难的,下面的代码就是一个Linux下的典型例子.

  


可以看到,这个配置文件本来就不长,除去注释之后内容就更少了, 很 容易理解,字面上稍微不容易理解的只有romimage和vgaromimage[3],它们指定的文件对应的其实就是真实机器的BIOS和VGA BIOS,读者自己操作的时候要确保它们的路径是正确的,不然过一会儿虚拟机启动时可能会被提示“couldn't open ROM image file”.读者还要注意floppya一项,它指定我们使用哪个文件作为软盘映像.

如果你在Windows下的话,romimage和vgaromimage两项指定的文件应该是安装目录下的BIOS-bochs-latest和 VGABIOS-lgpl-latest.当然,最保险的方法是参考安装程序自带的DLX linux的配置文件,将其稍作修改即可.

  好了,现在一切准备就绪,是时候启动了,输入命令:

  $ bochs -f bochsrc

  一个回车[4],你想要的画面就呈现在眼前了.是不是很有趣呢?

  顺便告诉你个窍门,如果你输入一个不带任何参数的Bochs并执行之,那么Bochs将在当前目录顺序寻找以下文件作为默认配置文件:

  · .bochsrc

  · bochsrc

  · bochsrc.txt

  · bochsrc.bxrc (仅对Windows有效)

   刚才我们的“-f bochsrc”参数其实是可以省略的.读者在给配置文件命名时不妨从这些文件里选一个,这样可以省去许多输入命令的时间.

  此外,Bochs的配置文件还有许多其他选项,读者如果想详细了解的话,可以到其主页上看一看. 本书中所用到的选项有限,在此不一一介绍.

  4.用Bochs调试操作系统

  如果单是需要一个虚拟机的话,你有许许多多的选择,本书下文也会对其他虚拟机有所介绍,之 Bochs称为我们的首选,最重要的还在于它的调试功能.

  假设你正在运行一个有调试功能的Bochs,那么启动后,你会看到控制台出现若干选项,默认选项为“6. Begin simulation”, 直接按回车键,Bochs就启动了,不过既然是可调试的,Bochs并没有急于让虚拟机进入运转状态,而是继续出现一个提示符,等待你的输入,这时,你就可以尽情操纵你的虚拟机了.

 还是以我们那个最轻巧的引导扇区为例,假如你想让它一步步地执行,可以先在07c00h处设一个断点──引导扇区就是从这里开始执行的, 这里就是我们的入口地址──然后单步执行,就好像所有其他调试工具一样.在任何时刻,你都可以查看CPU寄存器,或者查看某个内存地址处的内容.下面我就来模拟一下这个过程:用Bochs调试操作系统.pdf

  以上带有?符号并以加粗字体显示的是输入,其他均为Bochs的输出.如果你用过GDB,你会觉得这个过程很亲切.没错,它跟用GDB调试程序的感觉是很相似的,最大的区别可能就在于在Bochs的调试模式下我们需要跟CPU、内存、机器指令等内容打更多交道.

  在上面的演示过程中,最开始的“b 0x7c00”在0x7c00处设置了断点,随后的命令“c”让代码继续执行,一直到我们设置的断点处停止,然后演示的是用“dump_cpu”指令查看 CPU寄存器以及用“x”指令查看内存.随后用一个“n”指令让代码向下走了一步,“trace-reg on”的功能是让Bochs每走一步都显示主要寄存器的值.之 选择演示这些命令, 它们基本是调试过程中最常用到的.


如果你在调试过程中忘记了指令的用法,或者根本就忘记了该使用什么指令,可以随时使用help命令,所有命令的列表就呈现在眼前了.你将会发现Bochs的调试命令并不多,不需要多久就可以悉数掌握.Table 1列出了常用的指令以及其典型用法.


其中“xp /40bx 0x9013e”这样的格式可能显得有点复杂,读者可以用“help x”这一指令在Bochs中亲自看一下它代表的意义.

  好了,虽然你可能还无法熟练运用Bochs进行调试,但至少你应该知道,即便你的操作系统出现了问题也并不可怕,有强大的工具可以帮助你进行调试. Bochs是开放源代码的,如果你愿意,你甚至可以通过读Bochs的源代码来间接了解计算机的运行过程── Bochs就是一台计算机.

分享到:
评论

相关推荐

    基于springboot开发的前后端分离的简易进销存后台管理系统.zip

    基于springboot的java毕业&课程设计

    基于springboot-mqtt的温度、湿度、六氟化硫浓度实时监控系统.zip

    基于springboot的java毕业&课程设计

    会计信息化对华强公司内部审计的影响研究.docx

    会计信息化对华强公司内部审计的影响研究.docx

    修改谷歌提供的样例量子卷积神经网络模型,基于KDD99数据集进行训练,实现了网络攻击分类检测。.zip

    卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。 全连接层(Fully Connected Layer): 在CNN的末端,通常会有几层全连接层(也称为密集层或线性层)。这些层中的每个神经元都与前一层的所有神经元连接。 全连接层通常用于对提取的特征进行分类或回归。 训练过程: CNN的训练过程与其他深度学习模型类似,通过反向传播算法和梯度下降(或其变种)来优化网络参数(如滤波器权重和偏置)。 训练数据通常被分为多个批次(mini-batches),并在每个批次上迭代更新网络参数。 应用: CNN在计算机视觉领域有着广泛的应用,包括图像分类、目标检测、图像分割、人脸识别等。 它们也已被扩展到处理其他类型的数据,如文本(通过卷积一维序列)和音频(通过卷积时间序列)。 随着深度学习技术的发展,卷积神经网络的结构和设计也在不断演变,出现了许多新的变体和改进,如残差网络(ResNet)、深度卷积生成对抗网络(DCGAN)等。

    用泽尼克多项式拟合表面的功能matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    毕业设计基于java+Springboot+协同过滤的新闻推荐系统源码+全部资料(高分项目).zip

    毕业设计基于java+Springboot+协同过滤的新闻推荐系统源码+全部资料(高分项目本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。毕业设计基于java+Springboot+协同过滤的新闻推荐系统源码+全部资料(高分项目毕业设计基于java+Springboot+协同过滤的新闻推荐系统源码+全部资料(高分项目毕业设计基于java+Springboot+协同过滤的新闻推荐系统源码+全部资

    基于vue可视化前段开发的拖拽编辑,页面生成工具.zip

    基于vue可视化前段开发的拖拽编辑,页面生成工具.zip

    HLC直播视频流播放器

    HLC直播视频播放器示例代码,代码2021年的时候因工作需要实现,参考网上资源采用了jquery等框架。

    基于卷积循环神经网络的数字识别.zip

    基于卷积循环神经网络的数字识别

    课设毕设基于SpringBoot+Vue的家具销售电商平台 LW+PPT+源码可运行.zip

    课设毕设基于SpringBoot+Vue的家具销售电商平台 LW+PPT+源码可运行.zip

    2007开关稳压电源(E题).doc

    包含作品的设计论文doc文档,可直接修改,适合于电赛备赛、课程设计、毕设参考等。 摘 要 该电源以单端反激式DC-DC变换器为核心。市电通过自耦式调压器,隔离变压器,整流滤波后产生直流电压,经DC-DC变换得到题目所需输出电压,实现了开关稳压电源的设计。DC-DC变换器采用脉宽调制器(PWM)UC3842,通过调节占空因数使得输出电压UO在30V~36V范围内可调;微控制器与键盘显示构成了控制显示模块,能对输出电压进行键盘设定和步进调整,并显示输出电压、电流的测量和数字显示功能,形成了良好的人机界面。 关键词:DC-DC变换器,脉宽调制器(PWM)

    520节日画图代码.zip

    520是每年的5月20日,因数字“520”与“我爱你”发音相似而被许多年轻人用作表达爱意的节日。这个节日起源于中国互联网文化,逐渐传递到其他国家和地区。在这一天,情侣们通常会互送礼物、发表情、或者举行浪漫的活动来庆祝爱情。快来领取专属于程序员的浪漫吧!表白的套路很多,但都少不了送花送礼物,作为一个程序员,搞不懂现在流行的泡泡机、小猪、重力感应车等玩具,也不想去让朋友们去送钱炫耀,毕竟真情才重要,钱就物质了。我能给各位单身粉丝们做的可能就只有分享几个表白代码了,在电脑上敲上几行代码,让她在郁闷的周一得到一个大大的惊喜,很简单,一看就会,如果现在用不到也不要紧,先收藏起来,反正这样的节日很多,以后用的时候能找到。

    带你学AI基于PP-OCR和ErnieBot的字幕提取和智能视频问答

    本次分享将带领大家从 0 到 1 完成一个基于 OCR 和 LLM 的视频字幕提取和智能视频问答项目,通过 OCR 实现视频字幕提取,采用 ErnieBot 完成对视频字幕内容的理解,并回答相关问题,最后采用 Gradio 搭建应用。本项目旨在帮助初学者快速搭建入门级 AI 应用,并分享开发过程中遇到的一些坑,希望对感兴趣的同学提供一点帮助。 参考https://blog.csdn.net/u010522887/article/details/139025542,跟随笔者共同走完一个完整的视频问答项目,从基础的动手跑通 CRNN 文本识别任务,再到应用开发和部署,旨在帮助初学者快速入门 OCR 相关技术并搭建一个简单的应用。 资源包包括前端文档中提到的源码和示例视频。 本系列的后续文章将沿袭这一思路,继续分享更多采用 Paddle 深度学习框架服务更多产业应用的案例。如果对你有帮助,欢迎 **关注 收藏** 支持

    毕设设计-学生宿舍管理系统 基于SpringBoot实现,界面简洁,功能完善

    毕设设计-学生宿舍管理系统 基于SpringBoot实现,界面简洁,功能完善 主要功能 ● 定位打卡、宿舍智能分配、学生信息管理、资讯管理(权限设计)等 使用 ● mysql、git、springboot ● 数据库初始化sql存储在doc文件夹下面 设计一个基于Spring Boot的学生宿舍管理系统,你需要确保系统既满足实用性,又保证界面简洁、功能完善。以下是一个基本的设计方案,包括系统的功能模块、技术栈选择和界面设计要点。 ### 功能模块 1. **用户认证模块**: - 登录/登出功能。 - 用户权限管理(如学生、宿舍管理员、系统管理员)。 2. **学生信息管理**: - 学生基本信息录入、查询、修改和删除。 - 宿舍分配与调换。 3. **宿舍楼管理**: - 宿舍楼信息维护。 - 宿舍房间信息管理。 4. **维修报修管理**: - 学生报修申请。 - 维修状态跟踪。 5. **来访登记管理**: - 来访人员登记。 - 访问记录查询。 6. **公告与通知发布**: - 发布宿舍相关公告和通知。

    源码小游戏微信飞机大战

    源码小游戏微信飞机大战

    一个前后端分离的仿知乎问答论坛.zip

    基于springboot的java毕业&课程设计

    课程设计 基于Python的机器学习的人脸识别系统的设计与实现+详细文档+全部资料(高分项目).zip

    课程设计 基于Python的机器学习的人脸识别系统的设计与实现+详细文档+全部资料(高分项目).zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。课程设计 基于Python的机器学习的人脸识别系统的设计与实现+详细文档+全部资料(高分项目).zip课程设计 基于Python的机器学习的人脸识别系统的设计与实现+详细文档+全部资料(高分项目).zip课程设计 基于Python的机器学习的人脸

    基于springboot+thymeleaf构建的保险出单系统(含后台管理系统).zip

    基于springboot的java毕业&课程设计

    基于matlab鲸鱼优化随机森林WOA-RF数据分类(含数据)

    【RF分类】基于matlab鲸鱼优化随机森林WOA-RF数据分类MATLAB程序

    课设毕设基于SpringBoot+Vue的校园新闻网站 LW+PPT+源码可运行.zip

    课设毕设基于SpringBoot+Vue的校园新闻网站 LW+PPT+源码可运行.zip

Global site tag (gtag.js) - Google Analytics