Orange‘s’ 一个操作系统的实现

突然想要随时记录一下实验过程中的各种问题,因此有了此文档:

由于是中途开始的,所以就偷懒直接跳过了vm、ubuntu32位16.04、bochs2.6.8、nasm的安装,下面开始正文内容:

2022.5.15.23:34

P13

调试断点

dump_cpu->info cpu

附:

Bochs调试常用命令

https://blog.csdn.net/dc12499574/article/details/124059104

 x /64xb 0x7c00

注意需要在bochs运行时输入。我在执行上一条语句info cpu后bochs关闭,此时执行该语句会报command not found的错误,可以第二次运行bochs然后跳过上一条语句直接执行该语句即可正常运行

每条语句信息详解参考:《一个操作系统的实现》(二):使用Bochs调试操作系统_agul_的博客-CSDN博客

时间有限让我们直接跳到第三单元的保护模式。刚打完球,容我先去洗个澡,今天投篮巨准,被老大爷调侃神投手,低调低调,运气好罢了。

2022.5.16.12:06

忘记了nasm的使用在这里贴一下

· touch hello.asm

· gedit hello.asm

· nasm hello.asm -o hello.bin   或nasm -f elf64 hello.asm

报错显示行数,忘了打开行数显示了,gedit首先选择编辑-》重选项,查看里对“显示行号(D)”打勾,OK。

pm.inc 这个文件书上没给出?应该要放在同个目录下,emmm这里有个链接,暂未编辑成功不确定对不对80386保护模式--描述符,附pm.inc代码详解_jltxgcy的博客-CSDN博客

经检验除了第十行左右位置需要多加一个注释外该代码其余均正确

正常运行了耶,but那个p没有显示,看了一下源码估计是位置设置问题,反正能跑就行是吧,书上那个截图,眼珠子抠破都没看到他那个p在哪里,可恶

Emmmm看到后面发现原书第29页还是需要做的

Freedos实在找不到,网站好像不能访问了,找csdn代下吧

pm.img是需要格式化的,在此遇到一个问题,losetup指令不能执行显示设备在忙碌,可以输入sudo loop -f自动查找空闲的loop然后用他来格式化软盘,嗯嗯应该是这样我马上try一下

莫名其妙,重新创建了pm.img按照步骤就成了,无语,第一次怎么不成

再次尝试开悟:启动bochs打开freedos后重新对b盘初始化,即format B:,然后挂载就

成功了,我直接哭死,赶紧记下以防忘记。

********(省略无限脏话)哥们终于成了,在一点点刷成就感,一定要把配置环境时候被打消的意志重新拾起!

看了一下第四模块的书,有点小累,先做个ppt作业好了,2022.5.16.20:41

2022.5.17.21:10

今天排球比赛居然输了,无语,对面那么菜,无语

青楼一楼夏天的蚊子真的纯纯佛

回到正题,今天突然发现源码老师已经给出了一大堆资料的,之前还在苦苦寻觅,纯傻儿,不过这就引发了另外一个问题,怎么把windows下的文件传到虚拟机中呢,感觉最最方便的应该是共享文件夹了,刚刚设置了一下,emm不知道为什么没有出来,算了,另辟蹊径,不想在这个问题上浪费宝贵时间,于是乎我就把源码传到了gitee上,然后在虚拟机中登录gitee账户,完美在虚拟机中得到我心心念念的源码。欧耶!

在chapter4/b中调试的时候,P113中<bochs:5>这里和书不太一样哦,得看一下上一行在哪里停下的,不然就会啥都不给你跑

我的如下图:

23:19了哎

哦对,突然想到提醒一句,.bochsrc那个配置文件和给的代码有不太一样哦,就一点点不一样,根据报错csdn一下应该很快就能找到正确的,嘿嘿这里指的是第一单元的那个,有点马后炮了。

向loader交出指挥权的命令在112页,小记一下。

看到了吗看到了吗,我的L出来咯

一路磕磕绊绊,终于来到第五章了,先来个HelloWorld来hold住全场

然后是从Loader到内核实验,没什么大碍得完成了,要写的就是前面提到的sudo mount -o loop a.img /mnt/floppy/报前文的错也可能是没有执行写入软盘的命令,成功截图如下(是有内核的哦!)

0:48累了,明天继续吧,记录一下目前是在第五单元跳入保护模式还没开始,但代码文件已经准备完毕,晚安各位

2022.5.18.11:32

起得有点晚了,九点四十多才起的床,洗个衣服吃个饭,做完核酸我们继续冲冲冲!

这里想记一下第五章的一些步骤emmm,有点多记不住,每次都往前翻书太累了

刚开始肯定是编译啦

nasm boot.asm -o boot.bin

然后是写进软盘

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

继续编译

nasm loader.asm -o loader.bin

nasm -f elf -o kernel.o kernel.asm

ld -s -o kernel.bin kernel.o(向kernel交出控制权:ld -s -Ttext 0x30400 -o kernel.bin kernel.o)括号里一定要记得改啊呜呜,血泪教训

按照书本的内容执行sudo mount -o loop a.img /mnt/floppy命令时,可能遇到mount: /dev/loop0: can't read superblock错误。

解决方式如下:sudo mount -t msdos -o loop a.img /mnt/floppy/

sudo cp loader.bin /mnt/floppy/ -v

sudo umount /mnt/floppy/

然后写入软盘

sudo mount -o loop a.img /mnt/floppy/

sudo cp kernel.bin /mnt/floppy/ -v

sudo umount /mnt/floppy/

在遇到一些小小的错误之后终于理出了一条完美的语句执行顺序,并成功地出现了成果欧耶

进入了保护模式并且列出了内存使用情况

仔细研究了一下,应该是到了第六个环节了吧,重新放置内核应该是不需要吧嘻嘻,减轻了我的负担,突然发现一个礼拜搞完也不是不可能哈哈哈哈,我感觉我又行了,但是要少说多做,尽量先对我的快速完成计划闭口不言!冲冲冲!

Emmm发现第五章还有个内容,向内核交出控制权,可恶,任务顺序为什么和书上不一样,我还要杀个回马枪。

有惊无险解决,出来吧皮卡丘

Emmm第六章刚开始就不会操作了,只给出了一堆文件,细看之下,发现好像还要把第五章的扩充内核单元给学完emmm好烦哦,一点小懒都偷不得,可恶

切换堆栈和GDT

原f文件夹

编译

nasm boot.asm -o boot.bin

写进软盘

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

继续编译

nasm loader.asm -o loader.bin

nasm -f elf -o kernel.o kernel.asm

nasm -f elf -o string.o string.asm

nasm -f elf -o kliba.o kliba.asm

gcc -c -fno-builtin -o start.o start.c

ld -s -Ttext 0x30400 -o kernel.bin kernel.o \

  string.o start.o kliba.o

按照书本的内容执行sudo mount -o loop a.img /mnt/floppy命令时,可能遇到mount: /dev/loop0: can't read superblock错误。

解决方式如下:sudo mount -t msdos -o loop a.img /mnt/floppy/

sudo cp loader.bin /mnt/floppy/ -v

sudo umount /mnt/floppy/

然后写入软盘

sudo mount -o loop a.img /mnt/floppy/

sudo cp kernel.bin /mnt/floppy/ -v

sudo umount /mnt/floppy/

结果如下:

然后是MakeFile的学习

在经历过敲了那么多代码才运行成功一个文件后真的不得不感慨MakeFile真的太太太方便了吧,作者为什么不早点引用,我哭死,这边差不多就是光盘中的文件拿过来就可以直接用了,除了.bochsrc这个文件需要用自己的之外,如果用作者给出的bochsrc将会报read fail(?貌似是这么描述的吧,刚刚忘记记下了,反正就差不多这个意思,用.bochsrc总没错)

ContinueContinue

下面是添加中断处理:

报了个错,应该是kernel.asm出了问题,先检查了一下makefile这个文件,和之前成功编译的并没有对比出什么问题,莫非问题出在kernel.asm这个文件上,让我再来瞅一瞅

检查一周暂时没有发现什么问题,奇怪,尝试运行一波,发现结果一致哎,奇怪,emm就是那个#UD演示,我的结果如下

又try了一下原书第五章第i个实验,又是这个错emmm

再运行一波试试

又正常运行了,刚开始没啥反应然后敲完键盘之后出现了最后一行,愈发神奇了

突然开悟了,是不是因为代码本身就是通过错误来中断,编译的时候指出了错误,然后运行的时候再次给你错误提示中断,这就是书上说的双重保险吗哈哈哈哈哈

不过还有一点就是没有出现#GP报错哎,按照书上说了的改了来着

像这样emmm,然后重新make了一下发现还是#UD,不知道为啥,甚至这两行代码全部注释掉都还是这个错!!!绷不住了,是哪里出了问题

一通排查还是没有找到问题所在,希望有人可以指点迷津枯了

由于这个不是主线任务,emm还是不太想花费太多时间在这个上面,反正系统大体功能都实现了emm,已经迫不及待想进入第六章了,那我就冲了,看看之后有没有时间回到这里看看哪里有问题吧

进程启动

和原书有一点不一样emm更逆天的是这个居然报#GP错!,这不是我之前苦苦想要而不得的吗现在跑不出来几个意思啊

这个文件夹里的kernel.asm这几行注释掉了

Ok

那就让我把这个注释去掉try一下,结果emmm

多少是有点book思议在里面的,作者不会是搞反了?

不过最下面的打印我这里比书上多打印了很多,这是为什么呢,容我看看

巧了没看出来,不过思考一翻流程,感觉这并不是一个问题,可能只是哪个代码块多写了点什么吧,程序属于正常运行了,继续继续

这个也是成功运行了呢,首字母在不断地变化,和书上一样,有了make操作真的快了很多,不过有个问题就是中断结束之后就报异常了,是#GP,不知道这个正不正常,书上也没说emmm

就像下图的异常

想了一下,第一个字母是按照ASCII码依次打印的,那ASCII码的表打印完了是不是就要报异常了呢,感觉很有道理哈哈哈哈,哦哦还有刚刚看了一下kernel那个文件,这个文件夹里是有好几个版本的kernel1,2,3blabla,我说在一开始输入make的时候为什么它给我显示的不太一样,它这里给我们一个选择,是make stage?哪个版本,按照提示来就ok

但是为什么我的都显示一样呢,都是最后一个版本,莫非是a.img每次都需要格式化,试试先

划重点划重点,这里把前文的奇思妙想都推翻了

一通操作之后得出结论,作者的a.img已经是有内容的了,如果自己再初始化一个a.img然后make会报错emmm,所以之前copy过来的文件夹连make都不用执行,直接运行就ok,难怪make报错,有点开悟,先去吃个饭,饿了2020.5.18.18:18,hhhh这个时间点有意思

2022.5.18.19:31

继续继续。嗯嗯发现如果之前的make全部是失败的话并且运行的a.img全是作者已经给出的话就说明嗯,实验从教我用makefile之后的全是失败的,罢辽,做人就是要有把一切都推翻重新来过的勇气和毅力!希望我可以成功吧!

我!找!到!了!

还记得那张报错截图吗?有一个__stack_chk_fail问题就出在这,csdn搜一搜,应该是堆栈保护出了错,嘿嘿虽然不知道具体含义但是解决方案如下

在makefile CFLAGS后面加上  -fno-stack-protector  ,然后make clean 后重新编译

注意哦,自己新建的a.img的话要make image一下先,不然内容不会写到软盘里的

补个图,第五单元#GP,这回终于放心了

呜呜,成了成了都成了啊哇哇哇,图和上文一样就不补充了

啦啦啦,这是第六章丰富进程大类

Make stage1小类

Make stage2小类(第一个字母的差别哦)

Make stage3

Make stage4

Make stage5

Make final

对了差点忘了最最重要的一点,这几个过程怎么切换呢,我是采用笨办法,每次都先删除a.img,然后重新bximage一下重新创一个软盘,然后make clean清除掉上一个编译结果,然后make image重新编译后写入软盘,然后make stage1或2或blabla,选择其中之一,最后bochs -f .bochsrc运行就成了,感觉该方法会有累赘我猜,盲猜一手有些步骤有重复执行嫌疑,不过现在哥们懒得看了哈哈哈哈,后面如果有时间再说吧,反正现在可以正常运行就对了,佛系无敌

然后小结一下,1和2是让时钟中断处理可以不停地发生,2是会有显示第一个字母不断变化给人提示的。3和4是进程状态的保存与恢复。5是内核栈嗯应该就是课程要求的进程调度问题。

然后是解决中断重入的问题,冲冲冲,我也要做那个一个礼拜解决的人!!!

第六章最后一个问题,解决中断重入问题,看到第六章后面还有好多内容来着,希望这真的是第六章最后一个要求了。

愈发觉得找解决策略才是最主要的花费时间点emm,只要找到了正确的解决方案,后面的东西简直不要太简单,尤其是熟练了之后。

中断重入这个也分了好几部分,步骤我还是采用上一节的步骤,以下是结果

Make stage1

这个不会有异常哎,因为这个程序中一次中断还未处理完,又一次中断就发生了程序又回到了中断处理程序的开头啦。

21:56了,青楼阿姨要来赶人了,教室只剩下了我一个,赶紧溜之,晚点回到寝室继续冲冲冲!

2022.5.19.0:09

凌晨也不能组织我前进的步伐!

这个是make stage2的运行结果,通过设置了全局变量让中断处理程序知道自己是不是在嵌套执行

然后是make stage3

与不考虑中断重入结果相同但是这里考虑了中断重入

按照老师要求的话第六章应该是圆满结束啦,嘿嘿希望后面不会再要求我回过头来看第六章后面的内容—多进程

逃逃逃!我要赶紧步入第七章~~~

键盘初体验

总是感觉如果直接用作者提供的a.img多少有点没有意思了哈哈哈哈,所以每一个文件夹我都是删除了作者提供的软盘,然后自己创建一个,然后再配上自己的环境,自己运行自己写的才有意思,虽然代码不是自己写的哈哈哈哈,言归正传,这里是在键盘上任意输入一个键之后出现的*号,虽然不是按照理想的按一个键出现一个,不过作者卖个关子打算在后面解答,疯狂调动好奇心ing,现在都有点感觉给的这些任务都是些宝贝,就怕明天还没过完这些宝贝就被我消耗完了哈哈哈哈哈。继续继续

好像不早了,就一丢丢宝贝了呜呜,明天如果搞完还有时间看看能不能再搞点其他的哈哈哈哈,还挺好玩的。00:39了,都怪那瓶红牛,困意也就12345分,不过明天哦今天有英语翻译课,还是早早睡觉好了,哈欠打起,冲冲冲晚安everybody!

2022.5.19.14:43,软件构造基础实验课,反正大作业写完了,开始划水

以下是读取了键盘输入扫描码的截图,依次输入1-9,10个数字,产生20组代码,分别一一对应1-9,一个按键分别有一个MakeCode和一个BreakCode

加入了键盘输入缓存区

成功解析了扫描码

处理shift,alt,ctrl

处理多个扫描符如3个

处理F1等非打印字符

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对x86架构的处理器,业界一向是褒贬不一。但是毫无疑问的是,x86架构的处理器是迄今为止在市场上最成功的处理器。它既催生了Intel、微软这样的业界巨头,也改变了普通人们的生活。到今天,虽然有arm的异军突起,但是大部分程序员所编写的程序依然在运行在x86架构上。 虽然很多上层的程序员绕过了对CPU架构本身的理解,而直接使用高级语言进行编程,但是对CPU本身的熟悉,其实依然是所有想被称为优秀的程序员所难以绕过的一道坎。对CPU的不熟悉,实际上限制了程序员的思维方式、对程序的理解和实际解决问题的能力。 对于普通的芯片,阅读几页的说明书就可以大致理解如何让它工作。CPU是比较复杂的一种,对于比较简单的CPU架构,阅读几十页的文档也能大致熟悉。然而 x86架构的CPU的说明可不是这么简单,其手册估计有一共有四、五千页之巨。不要说理解透彻,就是从头到尾翻一遍也不是一件简单的事情。并非Intel 有意将它做得复杂,这里有历史的原因。因为这个架构的应用实在太广了,全世界有无数的软件都在它的基础之上工作。为此它自身的升级也就变得举步维艰。每次升级都不得不要兼容之前的特性。这也就导致了新旧指令层层堆积,种种特性互相兼顾,最终变成如今的一团乱麻了。 对于入门级的选手,读完那些手册可不是一件容易的事情。但是于渊的这本《orange's:一个操作系统实现》却是一条难得的终南捷径。因为要理解如何让一个芯片正常工作,最简单的办法就是从头开始去写程序让它运行起来,然后操作它做自己想做的事情。如果是平时的编程,这些下层的工作都已经有操作系统帮你做了,对理解x86架构的帮助就大为有限。如果去读那几千页的文档,不但读起来很痛苦,中间又没有多少可以实际操作的工作来帮助你温故而知新,这其中的枯燥乏味,绝对不是一般人可以忍受的了。而且更重要的手册中虽然包含了x86所有的特性,然而其中有些特性是现代操作系统根本就没有用到的。努力的去理解的话,又是吃力不讨好了。如果每个读者都可以随着这本书的介绍,去逐步的实现一个操作系统,不但这中间其乐无穷,而且实现到最后,对x86架构的理解也就不在话下。
orange's个操作系统实现》是一本关于操作系统实现的书籍,其中第六章无法运行可能有以下几个原因。 首先,书中的代码可能存在错误。编写代码时,一些细节的失误可能导致程序无法正确运行。这可能是作者在编写书籍时出现的问题,或者是影响到第六章的代码遗漏或错误。在实际操作中,我们应该检查在书中提供的代码并尝试找到错误。 第二,缺少必要的软件或工具。在开发操作系统时,通常需要使用一些特定的软件和工具,例如汇编器、编译器、链接器等。如果这些软件或工具没有正确安装或配置,可能会导致第六章中的代码无法运行。 第三,硬件环境不符合要求。在实际操作系统的开发中,硬件环境的要求可能较高。如果硬件配置不符合第六章中所述的要求,例如内存容量过低或者缺少某些关键的硬件设备,那么无法保证代码能够正确运行。 最后,操作系统开发环境的设置可能有问题。正确设置开发环境是操作系统开发的关键。如果遗漏了某些设置步骤,例如环境变量的配置或者文件路径的设置等,那么第六章的代码可能无法正常运行。 针对以上可能的原因,我们可以先检查书中代码的正确性,然后逐步检查所需软件和工具的安装与配置,以及硬件环境是否符合要求。如果仍然无法解决问题,我们可以尝试在相关的开发社区或论坛上寻求帮助,与其他开发者交流并寻找解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值