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

由于是中途开始的,所以就偷懒直接跳过了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等非打印字符

Orange‘s’ 一个操作系统的实现相关推荐

  1. 《Orange’s 一个操作系统的实现》3.保护模式3----DOS加载.EXE过程

    在<<Orange's 一个操作系统的实现>>一书中有时使用了org 0100h,为何是0100h?因为书中的例子是为了突破引导扇区512字节的限制, 而将asm文件编译为.c ...

  2. 《Orange’s 一个操作系统的实现》3.保护模式7-特权级转移(通过调用门转移目标段-无特权级转换)...

    在上次的代码基础上,添加一个代码段作为通过调用门转移的目标段.了解一下调用的工作方法,代码分析如下: <<红色标识部分为新增代码>> ; =================== ...

  3. 《Orange’s 一个操作系统的实现》3.保护模式1----pm.inc分析

    1.pm.inc定义了描述符.选择子及相关位数的取值 ; 描述符图示 ; 图示一 ; ;  ------ ┏━━┳━━┓高地址 ;         ┃ 7  ┃ 段 ┃ ;         ┣━━┫  ...

  4. 《Orange’s 一个操作系统的实现》1.搭建操作系统开发环境

    书中给出了两种环境:windows和linux,平台选择根据自己喜好.本人这里选择ubuntu10.04+virtualbox作为开发平台. 1.下载.安装VirtualBox     http:// ...

  5. 《Orange’s 一个操作系统的实现》3.保护模式4----LDT(Local Descriptor Table)

    还是在原有代码基础上进行修改,加入LDT的使用,代码分析如下(红色部分为新增代码): 本程序是在原有完成大内存读写测试完成后,调用局部任务显示字符L ; ======================= ...

  6. 《Orange's 一个操作系统的实现》学习笔记--LDT

    LDT(Local Descriptor Table)它和GDT差不多,都是描述符表(Descriptor Table)区别仅仅在于全局(Global)和局部(Local)的不同.局部描述符表可以有若 ...

  7. Orange‘s 一个操作系统的实现--Bochs遇到的问题

    1.Message: dlopen failed for module 'x': file not found 这是未安装bochs-x的缘故 解决方案: sudo apt-get install b ...

  8. orange's系统可以装mysql 吗?_bochs 2.4.2 ubuntu 安装运行问题《orange#39;s 一个操作系统的...

    用源码安装完后会遇到的问题: <1> 运行可能碰到如下问题: Event type: PANIC Device: [ ] Message: dlopen failed for module ...

  9. Orange's:一个操作系统的实现 Descriptor 3宏详解

    补充:关于GDT/LDT.段选择子和段描述符的解释       GDT/LDT:GDT/LDT是段描述符表,里面定义了每个段的段描述符的界限和属性,而段描述符的基址是在代码段中初始化的.        ...

最新文章

  1. 《高阶Perl》——导读
  2. 当yum 遇到No more mirrors to try
  3. qt5 linux 控制台 乱码,qt5.12 解决显示中文乱码问题
  4. 动态添加html元素
  5. Vue-cli项目中mockjs + axios实现前后端分离代码demo(清晰易懂)
  6. 第22课 抽奖 《小学生C++趣味编程》
  7. ES6学习笔记(三)—— Set 和 Map
  8. webform计算某几列结果_工业CAE案例实战精选|脱硫吸收塔工艺仿真计算系统
  9. data/mysql_error_trace.inc,09-在线挑战详细攻略-《真的很简单》
  10. android跳转到地图app
  11. 魅族android密码,魅族手机Flyme账户密码或密保忘记解决办法
  12. java对人脸打马赛克,如何给视频中的人脸进行马赛克 视频人脸打马赛克软件|人脸跟踪马赛克...
  13. MT7688的openwrt下4G的移植
  14. 高中OJ3837. 【NOIP2014模拟9.14】心灵终结
  15. “云”上就诊,泽塔云超融合助力医院数字化转型
  16. 数据库——完整性约束条件
  17. python windows api hook_windows hook + pyhook3 + python win32api hook + C 键盘hook
  18. 怎样把txt导入python_python 将txt导入excel
  19. 一键获取主图设计模板的工具平台
  20. klouderr什么意思_tackle是什么意思_tackle的翻译_音标_读音_用法_例句_爱词霸在线词典...

热门文章

  1. 【2万字长文】深入浅出主流的几款小程序跨端框架原理
  2. DIY Arduino 方向盘
  3. 游戏设计的236个技巧pdf
  4. Java毕业设计_基于SSH的Java EE开发技术课程网站设计
  5. [转]pygame外星人入侵
  6. 修复win7无法启动
  7. PyqtGraph中ImageView的ROI里边是什么信号,有些懵逼
  8. 亲测89元小度智能音箱,这或许是国民级智能音箱应有的姿态
  9. 英语口语8000句-重要的提醒和忠告
  10. 电阻(3)电阻封装篇等