扇区制作总结 第1篇

a、 解释为分区起始位置

将当前光标所在位置的扇区,解释为一个分区的起始扇区,如果该扇区的数据符合分区头扇区数据特征,系统会自动识别该扇区大小,否则,系统会提示用户输入该分区的大小。

将解释出来的分区在左侧列表中会显示出来,标识的颜色比正常分区的颜色稍浅一些。如下图所示:

b、 字节序解释转换

字节序转换影响的范围是数据解释器,默认解释为小端(Little-Endian)字节序:

1)小端(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。

2)大端(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端。

c、 计算器

对扇区数据进行快速地计算,可以使用计算器工具。如下图所示:

d、 目录浏览器

使用【目录浏览器】可显示或隐藏目录文件窗口。如下图所示:

来自: ldjsld > 《待分类》

0条评论

发表

请遵守用户 评论公约

扇区制作总结 第2篇

软盘和硬盘一样,是一种存储介质,但目前已经很少使用。我们将使用bochs创建虚拟软盘。

软盘使用FAT12文件系统。我们写好loader后,会把它存储到软盘中。

先介绍一下软盘的数据结构分布图。

我们使用的软盘是软盘。这种软盘有80个磁道,每个磁道有18个扇区。软盘有两个盘面,因此这种软盘的容量是:

软盘容量 = 80 * 18 * 512 * 2 / 512 = 2879个扇区≈。

我们使用BIOS的中断int 13h从软盘中读取数据到内存中。先看下图了解一下中断int 13h的用法。

什么是BIOS中断?我们不必纠缠这个概念,先从我们熟悉的高级语言的角度理解int 13h

int 13h理解成一个函数,把这个函数命名为ReadSectorFromFloppy

这个函数的声明是:void ReadSectorFromFloppy(int ah, int al, int ch, int cl, int dh, int dl, char *dest)。除最后一个参数char *dest外,这个函数的参数对应上图中的同名寄存器。char *dest对应上图中的es:bx

ReadSectorFromFloppy的作用能简化为:把数据从src复制到dest指定的内存地址处。只不过,src不是通过一个参数传递给函数,而是通过一系列参数传递给函数。再说得明确一些,一系列参数联合起来告诉了函数src是多少。

怎么调用ReadSectorFromFloppy?很简单,按照函数声明传递参数给它就行。对int 13h的使用也是如此,将每个寄存器需要的值填入对应的寄存器,然后,使用int 13h。使用int 13h的伪代码如下:

我们在后续的开发过程中,还会多次遇到对一些端口的读写操作。和这里的BIOS中断的类似,都能用高级语言中的函数来理解。没什么神秘的,传递一些参数,然后执行某种操作,从某个指定的地址获取数据。仅此而已。

上面说得轻描淡写,大家可能会以为我们只要三四分钟就能从软盘中读取loader了。真这么顺利吗?让我们来试试。

除了四个参数未知,还需要知道调用ReadSector几次才能读完全部loader数据。让我们带着这些疑问去多了解一下软盘。

一张的软盘中存储的数据的结构如下图所示。

补充说明一下这张图:

猜猜看,loader存储在软盘数据结构的哪个区域?

显而易见,loader被存储在数据区。

补充说明一点。每个扇区只会存储一个文件的数据,绝对不会存储两个文件的数据。例如,文件A的大小是510字节,从扇区号为N的扇区的最开始那个字节存储文件A。N号扇区存储完A文件后,还剩下2个字节。这个时候,如果往软盘中存储文件B,文件B的大小是2个字节,文件B也不会使用N号扇区的剩下的2个字节来存储,而是会重新使用一个完全没有使用过的扇区来存储文件B。软盘、硬盘都是如此。

继续回到我们的主题。

根目录的大小由软盘能存储的最大文件数量决定。但是,根目录的大小一定是整数个扇区。

根目录由若干个根目录项组成。根目录项是一段32个bit的存储空间。在根目录项中,最有用的是_文件名_和“文件名对应的文件在数据区中的第一个扇区的扇区号”。

先看一段伪代码。它非常清楚地说明了根目录的作用:根据文件名找到文件对应的根目录项,从目标根目录项中找到文件在数据区的第一个扇区的扇区号。

在后面,我们会使用nasm实现和伪代码思路相同的汇编函数。

如果用C语言为根目录项建立一个struct,将会是下面这样的。

先说结论:一个文件对应的所有FAT表项构成一个单链表。

什么是FAT表项?它们怎么构成一个单链表?请继续往下看。

从根目录中找到目标文件在数据区的第一个扇区的扇区号,就知道从哪个扇区读取数据了。

可是,根目录只提供了目标文件的第一个扇区的扇区号。如果目标文件需要两个以上扇区存储呢?如何知道第二个扇区、第三个扇区、第N个扇区的扇区号呢?FAT表会提供这些信息。

回忆一下软盘的数据分布图,图中有FAT1FAT2,它们都是FAT表,我们只需从一个FAT表中获取数据,就选择FAT1吧。

FAT1的大小是9个扇区,512*9个字节。每12个bit构成一个FAT表项,FAT表项的值有两重含义:

举例说明。软盘中存储着文件名为CG的文件。CG的大小是514个字节。从根目录中查询到CG在数据区的第一个扇区的扇区号是4。

4除了是扇区号,还是FAT表项的编号。注意这句话,非常重要。

FAT1中找到编号为4的FAT表项,这个FAT表项的值是5,那么,5既是下一个FAT表项的编号,又是下一个扇区号。也就是说,CG对应的FAT表项是第4个FAT表项、第5个FAT表项;在数据区占用的扇区是第4个扇区、第5个扇区。

根据当前FAT表项找到下一个FAT表项,这其实就是一个单链表。和单链表一样,FAT表项构成的单链表也有一个尾结点。识别伪结点的方法是判断FAT表项的值是否大于等于FAT_Entry_ValueFAT_Entry_Value是一个具体的值,等我们写代码时再看看它是多少。

本小节的目的是弄清楚:根据FAT表项的编号计算FAT表项的值。

先看一下FAT表项图。

每个FAT表项占用12个bit,计算机读取数据的最小单位是1个字节8个bit。为了每次都读取到完整的FAT表项,需要一次读取2个字节16个bit。16个bit只能存储一个FAT表项。怎么存储?只有图2-2的两种情况。

每次读取FAT表项,都会读取两个字节,而这两个字节的低12位和高12位都可能是FAT表项。要想获取FAT表项,首先要读取两个字节,然后要判断FAT表项存储在低12位还是高12位。这对我来说,是一个有点费劲的问题,我会写得详细一些。

用具体例子来寻找判断FAT表项存储位置的方法。FAT表存储在初始地址为512字节的存储空间中。

观察表格中的“编号”列和“注释_列,能得到下面的结论:

知道了FAT表项编号N,怎么计算存储FAT表项的存储空间的字节偏移量?计算公式是:N * 12 / 8。例如,编号为2的FAT表项的存储空间的初始地址是:2 * 12/8 = 3 。

最后,再看一张图。

定位FAT项在软盘中的位置,需要确定两个值:

结合上面的示意图来解释。扇区偏移量是N,字节偏移量是M。读取N+1号扇区后,从N+1号扇区的第M字节开始读取两个字节,目标FAT项就存储在这两个字节中。

现在,可以给出查询FAT表项的值的伪代码了。

在上面的伪代码中,检查FAT项的字节偏移量是不是整数个字节的方法是根据FAT项的编号识别。除了这种方法,还有第二种方法。这个方法如下所述:

在后面会讲到的GetFATEntry函数中,使用的是第二种方法。理解不了这个函数的代码的时候,记得回头看看这里的讲解。

扇区制作总结 第3篇

用户根据自己的需要,可以通过多种方式定位扇区位置,非常方便。

a、 查找16进制数

输入相应的搜索条件进行快速查找。如下图所示:

b、 查找文本

可快速查找符合搜索条件的文本数据。如下图所示:

c、 转到偏移量

下拉框中的数值在跳转后可以保存,当下次打开此对话框时候可以在下拉框中选择。如下图所示:

d、 转到扇区

快速跳转到指定扇区。如下图所示:

e、 快速转到指定扇区

可快速跳转到上一个、下一个扇区。转移到第一个、最后一个扇区。

f、 快速转到光标焦点

可快速跳转到第一次、后一次光标焦点。