扇区制作总结(实用3篇)
扇区制作总结 第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表会提供这些信息。
回忆一下软盘的数据分布图,图中有FAT1
和FAT2
,它们都是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_Value
。FAT_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、 快速转到光标焦点
可快速跳转到第一次、后一次光标焦点。
声明:本站所有文章资源内容,如无特殊说明或标注,均来源于用户上传或互联网资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除,联系方式在页脚,本站核实后会在一个月内进行删除。