总算是把这本书啃完了。。把笔记整理一下就当学会了吧。。
通过这本书确实能学到一些东西,能更底层地了解操作系统是怎么和硬件交互的,是如何一步步搭建的。但是作者为了让读者觉得开发操作系统有趣详细讲解了很多没什么用的功能,也抛弃了很多重要的操作系统组成部分。比如作者花费了大量信息设计窗口、鼠标、怎么显示这些东西,但这其实并不是操作系统所必须的,只是单纯让读者做完之后觉得自己做了个很厉害的东西。而文件管理、进程、段页这些重要的东西要么一点没讲,要么就是最简单地实现,而实现的目的居然还是为了显示鼠标、窗口。。
而且这本书的代码实现方式就是面向过程地不停向上累加,好在作者会定期重构一下,这一点我不得不崇拜作者的耐心和勇气。。代码写成这样了居然还能重构成功,一般人改完估计得找两个月才能找到bug在哪。。而这种构建方法的弊端就是我们要自己梳理操作系统的各个组成模块以及他们的之间的沟通方式。虽然作者强调了两次做一个操作系统应该一步一步来,不要想着设计好了再下手,但我实在难以苟同现在这个实现方法。
还有一点就是感觉作者真的是为了实现这个操作系统不择手段。。为了返回到正确的地址真的是各种改寄存器。。我也不知道现实里做一个操作系统是不是真这样。。如果不是那就很误导人了。不过抛开具体的实现方法,至少怎么和硬件交互、怎么把中断信号和函数绑定这些过程肯定是书里写的这样的,有了这些基本操作其实我更想自己去想更好的实现方法。毕竟作者的这个实现方法真的是太乱了。。这真的不是我自负什么的。。真的太乱了。。
.img文件:二进制代码,CPU可直接执行的代码
Bz.exe:通过二进制编辑器可以以16进制的形式查看.img文件是什么样的
真机运行:
打开cmd
运行install.bat:使用imgtol.com 向磁盘写入.img文件
run.bat:将.img文件复制到qemu/下变为.bin文件;使用make.exe指定qemu/,运行QEMU模拟器
nask.exe:可以将.nas汇编语言代码翻译为.img二进制代码
DB:向文件中写入1个字节的数据,可以连续写入;可以后接字符串,汇编语言会自动将每个字符翻译为对应的编码并按字节为单位排列起来
RESB 10:从当前地址开始空出10个字节,nask.exe会自动往空出的位置填0x00
汇编语言生成.img文件
写一个asm.bat文件,内容为使用nask.exe将.nas文件编译为.img文件
扇区:硬盘读写的基本单位,一个扇区一般大小为512字节
磁道:磁道为硬盘上的一个同心圆就是一个磁道,一个磁道一般包含63个扇区。以前的技术CAV的硬盘内圈和外圈的每个磁道的扇区数是相同的;但先进的技术ZDR将磁道划分为了16个区域,越靠外圈转速越快,外圈区域的扇区数要多于内圈的区域的扇区数,windows的C盘就处于最外圈
柱面:多个磁头的相对位置其实是固定的,因此为了增大传输效率,可以将数据以柱面的形式存储,各盘面的相同磁道就组成了一个柱面,当读写一个文件时,由多个磁头同时读写到各盘面中相同位置的磁道上。
分区:多个连续的柱面组成一个分区,属于逻辑上对磁盘空间进行划分
$:变量,表示所在位置的字节数
启动区(boot sector):磁盘第一个扇区,计算机会首先从第一个扇区开始读软盘,先检查此扇区的最后2各字节内容:只有最后两个字节为55AA时,计算机才认定第一个扇区内有启动程序,然后正常执行第一个扇区内的内容。
IPL(inital program loader):实际的操作系统可能大于512字节,无法完全放到启动区内,一般将加载操作系统的程序放在启动区内。
bootstrap:使用IPL这种分级式地启动操作系统的机制
JMP SHORT label:短跳指令,只能跳转到256字节的范围内
可理解的汇编代码
JMP SHORT LABEL_START;NOP;跳到机器的引导代码部分
FAT的起始位置:第1扇区(当磁盘中的一个文件大于512字节时,文件内容会存入不同的扇区内,需要FAT索引到各文件的各部分分布在哪些扇区)