30天自制操作系统读书笔记(一)

刚开始作者叫我们用二进制编辑器,手敲01代码写了个IMG(磁盘映像文件)

,并提供了一些文件

Run.bat, install.bat这些一个批处理文件,其实就是写好了cmd指令保存到文档里面,方便以后执行。

其中run.bat里面的指令是这样的

copy helloos.img ..\z_tools\qemu\fdimage0.bin

..\z_tools\make.exe         -C ../z_tools/qemu

(稍微解释一下:第一行:copy指令把,helloos.img 复制成..\z_tools\qemu\fdimage0.bin其中 ..\表示上级目录。

第二行使用make程序 -C ../z_tools/qemu 表示传递给make的参数。具体什么作用目前还不知道)

然后是install.bat:

..\z_tools\imgtol.com w a: helloos.img  //此句是将helloos.img写到软盘上

(我也不会,刚百度的。)

作者提供了一个虚拟器,所以为了避免麻烦,我就使用虚拟器了。

哦,虚拟器,run.bat的作用就显而易见了,就是把磁盘映像复制到虚拟器目录下然后并启动它。

或许作者觉得手写01代码实在过于麻烦,于是他又改用了汇编代码。

书中使用的汇编编译器 NASK是作者自己开发的

第一段汇编代码中作者只是使用了 DB指令,表示定义一个字节。

作者也觉得的代码太长,于是又使用了RESB指令。

RESB是给编辑器的指令,告诉编辑器空出多少多少空间来,作者的nask编辑器,会自动给空出来的地址补上0x00,这样代码长度就减少多了!

然后作者竟然一个大跳跃,直接上了连爹妈都不认识的改良版代码。

刚开始一堆DB DW的,作者称为标准FAT12软盘专用代码。

我不知道为什么需要这个东西。。特地百度了下:

这段完全由数据组成的代码只是符合了一个软盘启动扇区的标准

好吧,我自己反正是不太明白,于是我又百度了一个答案:

引导扇区是软盘的第0个扇区,在这个扇区中有一个很重要的数据结构叫BPB(BIOS Parameter Block),下面是引导扇区格式,其中BPB_开头的属于BPB,以BS_开头的只是BOOT Sector的一部分,不属于BPB。


名称


开始字节


长度


内容


参考值


BS_jmpBOOT


0


3


一个短跳转指令


jmp Label_07c00H
nop


BS_OEMName


3


8


厂商名


‘QingFeng‘


BPB_BytesPerSec


11


2


每扇区字节数(Bytes/Sector)


0x200


BPB_SecPerClus


13


1


每簇扇区数(Sector/Cluster)


0x1


BPB_ResvdSecCnt


14


2


Boot记录占用多少扇区


ox1


BPB_NumFATs


16


1


共有多少FAT表


0x2


BPB_RootEntCnt


17


2


根目录区文件最大数


0xE0


BPB_TotSec16


19


2


扇区总数


0xB40[2*80*18]


BPB_Media


21


1


介质描述符


0xF0


BPB_FATSz16


22


2


每个FAT表所占扇区数


0x9


BPB_SecPerTrk


24


2


每磁道扇区数(Sector/track)


0x12


BPB_NumHeads


26


2


磁头数(面数)


0x2


BPB_HiddSec


28


4


隐藏扇区数


0


BPB_TotSec32


32


4


如果BPB_TotSec16=0,则由这里给出扇区数


0


BS_DrvNum


36


1


INT 13H的驱动器号


0


BS_Reserved1


37


1


保留,未使用


0


BS_BootSig


38


1


扩展引导标记(29h)


0x29


BS_VolID


39


4


卷序列号


0


BS_VolLab


43


11


卷标


‘QingFeng‘


BS_FileSysType


54


8


文件系统类型


‘FAT12‘


引导代码及其他内容


62


448


引导代码及其他数据


引导代码(剩余空间用0填充)


结束标志0xAA55


510


2


第510字节为0x55,第511字节为0xAA


0xAA55

噢!原来是数据结构。叫做BIOS Parameter Block (BIOS参数块),那么顾名思义一下?或许是给bios读取用的吧!?

对了还有一个重要的$符号,作者解释的很详细了,博主比较懒,所以就不打字了!

好啦,只剩下几个名词了,自己看书吧。

稍微总结下不太熟悉的几个知识点:

1、  启动区是第一个扇区,512字节为一个扇区。扇区的最后2个字节为55 AA

启动区的名称必须是8个字节,不够的话空格补齐.

2、  IPL ,启动程序加载器。启动区只有512字节,所以在这里面根本装不下操作系统,

所以里面里面存放的是加载操作系统本身的程序。

3、db定义字节型1字节,dw定义字类型2字节,dd定义双字类4字节

恩,时间不早了,第一天就这么过去吧. 喂喂喂!那段这么长的代码,你倒是分析下啊!

(不会!)

时间: 2024-10-14 08:26:12

30天自制操作系统读书笔记(一)的相关文章

多定时器处理1(30天自制操作系统--读书笔记)

自认为写过很多MCU程序,但总是回头想想,我所了解的MCU编程思想大体有两种,其中具体的想法我得再找时间写下来. 总想总结出一个可扩展的,易移植的写法,但能力还没到这个层次.但<30天自制操作系统>这本书确实给我了一个思路,就像我已经写过的两篇读书笔记. 将两个独立的内容--FIFO和内存动态管理做到高度模块化,尤其是其中数据结构模型的设计更是我学习的好例子. 今天要学习的设计内容是多定时器处理.原书对这部分的处理讲的很详细,由浅入深,看得我由衷佩服作者,也可能是因为我水平低,稍稍看出点门道来

内存管理(30天自制操作系统--读书笔记)

今天继续读书笔记,“挑战内存管理”(30天自制操作系统). 为什么对这块内容敢兴趣呢,因为曾经遇到这么一个问题.在STM32程序中想使用队列,可不是上篇讲的FIFO,而是使用了较大的内存空间,又想做队列的顺序存取管理. 在这个队列里用到了malloc,动态申请内存,一开始是直接申请不到内存,后来在启动脚本里更改了设置堆的地址值,可以申请成功,但发现申请几次后,也申请不到内存. 果然MCU级别的程序,内存这块处理起来就没有windows程序那么随心所欲了.讲了这么多,开始正题吧. 1.相关数据结构

单字节的FIFO缓存(30天自制操作系统--读书笔记)

从今天起,写一些读书笔记.最近几个月都在看<30天自制操作系统这本书>,书虽说看的是电子书,但可以花钱买的正版书,既然花费了金钱,就总得有些收获. 任何人都不能总是固步自封,想要进步就得学习别人的知识,对于程序员而言,最简单的方法即是学习别人的代码. 今天的标题是“单字节的FIFO缓存”,其实就是做一个FIFO,看名字就知道了.也就4个函数和1个相关结构体,这样的小代码在嵌入式系统中很常用,也会很好用. 1.相关数据结构体 struct FIFO8 { unsigned char *buf;

多定时器处理2(30天自制操作系统 -- 读书笔记)

今天的内容依然来自<30天自制操作系统>这本书. 1.中断处理程序存在的问题,中断处理程序Timer_Interrupt如下: //定时器中断函数 void Timer_Interrupt(void) { int i=0; timerctl.count ++; for(i=0;i<MAX_TIMER;i++) //扫描所有的定时器 { if(timerctl.timer[i].flag == TIMER_FLAG_USING) { timerctl.count--; if(timerct

30天自制操作系统读书笔记(二)

我还以为马大哈的作者忘记解释之前那段好长的汇编代码了,留下这么多疑惑! 第二天作者就交代了:以后再讲,第二天我们先来谈谈程序核心部分的内容吧! 好吧,刚准备欢喜的等着作者解释,没想到他就扔了一大串代码(什么鬼?) ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址,这个指令是和nask编译器说的(伪指令)告诉nask,开始执行的时候,把代码放到0x7c00的地方. ;为什么是0x7c00呢,因为规定了0x7c00-0x7dff是启动区的装载地址. ; 以下用于标准

30天自制操作系统读书笔记(五)

为了让程序灵活点,作者觉得把什么320X200这些数据直接写入程序,不如让程序自己获取. 所以就引入了结构体,指针.用指针直接在内存中获取这些数据 (如程序里的这句: Binfo_scrnx = (short *) 0xff4; ). 对于结构体和指针我就不细写了,有C语言基础的人都知道. 因为已经进入了32位模式,所以不能再用bios写好的中断程序给我们输出字符了,要手动了! 用像素点描出图形. 字符可以使用8X16的长方形像素点来表示,转变为16进制就是这样: static char fon

多定时器处理3(30天自制操作系统 -- 读书笔记)

继续定时器中断处理的改进. 1.定时器中断程序Timer_Interrupt是这样的. //定时器中断函数 void Timer_Interrupt(void) { int i=0; timerctl.count ++; for(i=0;i<MAX_TIMER;i++) //扫描所有的定时器 { if(timerctl.timer[i].flag == TIMER_FLAG_USING) { timerctl.count--; if(timerctl.count == 0) //减得时间到了 {

30天自制操作系统读书笔记(四)

想要在画面里画点什么东西,就需要往VRAM的内存区里写入点什么东西. 但是如何写入呢? 作者先用了汇编: _write_mem8:         ; void write_mem8(int addr, int data); MOV                  ECX,[ESP+4]               ; [ESP + 4]中存放的是地址,将其读入ECX MOV                  AL,[ESP+8]                 ; [ESP + 8]中存放的

《30天自制操作系统》笔记(12)——多任务入门

<30天自制操作系统>笔记(12)——多任务入门 进度回顾 上一篇介绍了设置显示器高分辨率的方法.本篇讲一下操作系统实现多任务的方法. 什么是多任务 对程序员来说,也许这是废话,不过还是说清楚比较好. 多任务就是让电脑同时运行多个程序(如一边写代码一边听音乐一边下载电影). 电脑的CPU只有固定有限的那么一个或几个,不可能真的同时运行多个程序.所以就用近似的方式,让多个程序轮换着运行.当轮换速度够快(0.01秒),给人的感觉就是"同时"运行了. 多任务之不实用版 我们首先从