30天自制操作系统-第1天

总算是把这本书啃完了。。把笔记整理一下就当学会了吧。。

通过这本书确实能学到一些东西,能更底层地了解操作系统是怎么和硬件交互的,是如何一步步搭建的。但是作者为了让读者觉得开发操作系统有趣详细讲解了很多没什么用的功能,也抛弃了很多重要的操作系统组成部分。比如作者花费了大量信息设计窗口、鼠标、怎么显示这些东西,但这其实并不是操作系统所必须的,只是单纯让读者做完之后觉得自己做了个很厉害的东西。而文件管理、进程、段页这些重要的东西要么一点没讲,要么就是最简单地实现,而实现的目的居然还是为了显示鼠标、窗口。。

而且这本书的代码实现方式就是面向过程地不停向上累加,好在作者会定期重构一下,这一点我不得不崇拜作者的耐心和勇气。。代码写成这样了居然还能重构成功,一般人改完估计得找两个月才能找到bug在哪。。而这种构建方法的弊端就是我们要自己梳理操作系统的各个组成模块以及他们的之间的沟通方式。虽然作者强调了两次做一个操作系统应该一步一步来,不要想着设计好了再下手,但我实在难以苟同现在这个实现方法。

还有一点就是感觉作者真的是为了实现这个操作系统不择手段。。为了返回到正确的地址真的是各种改寄存器。。我也不知道现实里做一个操作系统是不是真这样。。如果不是那就很误导人了。不过抛开具体的实现方法,至少怎么和硬件交互、怎么把中断信号和函数绑定这些过程肯定是书里写的这样的,有了这些基本操作其实我更想自己去想更好的实现方法。毕竟作者的这个实现方法真的是太乱了。。这真的不是我自负什么的。。真的太乱了。。

 

.img文件:二进制代码,CPU可直接执行的代码

Bz.exe:通过二进制编辑器可以以16进制的形式查看.img文件是什么样的

真机运行:

        格式化磁盘

        打开cmd

        运行install.bat:使用imgtol.com 向磁盘写入.img文件

        将磁盘插入真机就会自动运行写入的程序

模拟器运行:

        打开cmd

        run.bat:将.img文件复制到qemu/下变为.bin文件;使用make.exe指定qemu/,运行QEMU模拟器

        模拟器会弹出并运行写入的程序


nask.exe:可以将.nas汇编语言代码翻译为.img二进制代码

DB:向文件中写入1个字节的数据,可以连续写入;可以后接字符串,汇编语言会自动将每个字符翻译为对应的编码并按字节为单位排列起来

DW:向文件中写入2个字节的数据

DD:向文件中写入4个字节的数据

RESB 10:从当前地址开始空出10个字节,nask.exe会自动往空出的位置填0x00

汇编语言生成.img文件

        编写.nas汇编语言代码

        打开cmd

        使用nask.exe将.nas文件编译为.img文件

简化汇编语言生成.img文件的命令

        写一个asm.bat文件,内容为使用nask.exe将.nas文件编译为.img文件

        这样打开cmd后,运行asm就能执行编译过程


扇区:硬盘读写的基本单位,一个扇区一般大小为512字节

磁道:磁道为硬盘上的一个同心圆就是一个磁道,一个磁道一般包含63个扇区。以前的技术CAV的硬盘内圈和外圈的每个磁道的扇区数是相同的;但先进的技术ZDR将磁道划分为了16个区域,越靠外圈转速越快,外圈区域的扇区数要多于内圈的区域的扇区数,windows的C盘就处于最外圈

磁头:一个硬盘的盘片一般有两个磁头,盘片两面都记录数据

柱面:多个磁头的相对位置其实是固定的,因此为了增大传输效率,可以将数据以柱面的形式存储,各盘面的相同磁道就组成了一个柱面,当读写一个文件时,由多个磁头同时读写到各盘面中相同位置的磁道上。

分区:多个连续的柱面组成一个分区,属于逻辑上对磁盘空间进行划分

$:变量,表示所在位置的字节数

启动区(boot sector):磁盘第一个扇区,计算机会首先从第一个扇区开始读软盘,先检查此扇区的最后2各字节内容:只有最后两个字节为55AA时,计算机才认定第一个扇区内有启动程序,然后正常执行第一个扇区内的内容。

IPL(inital program loader):实际的操作系统可能大于512字节,无法完全放到启动区内,一般将加载操作系统的程序放在启动区内。

bootstrap:使用IPL这种分级式地启动操作系统的机制

JMP SHORT label:短跳指令,只能跳转到256字节的范围内

NOP:空指令,什么都不做,凑字节数

可理解的汇编代码

        FAT12格式软盘固定代码:

                JMP SHORT LABEL_START;NOP;跳到机器的引导代码部分

                写入启动区的名称:8字节

                声明每个扇区的大小:512字节

                簇的大小:1个扇区

                FAT的起始位置:第1扇区(当磁盘中的一个文件大于512字节时,文件内容会存入不同的扇区内,需要FAT索引到各文件的各部分分布在哪些扇区)

               指定根目录大小:一般224项

               声明磁盘大小:2880个扇区

               声明磁盘的种类:0xf0

               声明FAT的长度:9扇区

               声明一个磁道有几个扇区:18个

               声明磁头数:2个

               是否使用分区:否0

               声明磁盘大小:2880,再写一遍

               DB 0x00,0x00,0x20:固定格式

               卷标号码:0xffffffff(可能是)

               声明磁盘名称

               声明磁盘格式名称:“FAT12      ”

               RESB 18

        程序主体:

                依旧是16进制代码,无法理解

        信息显示部分:

                2个换行

                声明想要输出的字符串

                换行

                DB 0x00

                RESB 0x1fe-$:空到0x001fe位置

                DB 0x55, 0xaa:0x001fe,0x001ff的值必须是55AA

        其余部分:

                依旧是16进制代码,无法理解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值