题外话:
扇区:是磁盘存储数据的基本单位,512
字节,块设备
如何定位一个扇区呢?
⽂件=内容+属性都是数据,⽆⾮就是占据那⼏个扇区的问题!能定位⼀个扇区了,能不能定位多个扇区呢?
sudo fdisk -l
sudo fdisk -l
命令用于查看系统的磁盘分区信息。sudo
是用于以超级用户(root)权限执行命令,因为查看磁盘分区信息可能需要较高的权限,fdisk
是一个用于磁盘分区操作的工具,-l
参数表示列出(list)磁盘分区信息。磁盘设备信息解读
/dev/loop*
设备: /dev/loop0
、/dev/loop1
等是循环设备(loop device)。循环设备是一种伪设备,它可以将文件模拟成块设备来使用。这些循环设备通常用于挂载磁盘镜像文件等操作,例如在容器技术(如Docker)或者挂载某些加密的磁盘镜像等场景下会经常看到。/dev/loop0
为例,它的大小是 63.7 MiB
,包含 130448
个扇区,每个扇区大小为 512
字节(Sector size (logical/physical): 512 bytes / 512 bytes
),最小和最优的I/O大小都是 512
字节。/dev/vda
设备: 40 GiB
,总共包含 83886080
个扇区,每个扇区同样是 512
字节。Disklabel type
)是 dos
,这是一种比较常见的磁盘标签格式,它主要用于兼容传统的基于MS - DOS的分区表格式。磁盘标识符(Disk identifier
)是 0xb51ab772
,用于唯一标识这个磁盘。/dev/vda1
,这是 vda
磁盘上的一个分区,*
表示这个分区是可引导分区(Boot),它从扇区 2048
开始,到扇区 83886046
结束,包含 83883999
个扇区,分区大小是 40G
,分区类型ID是 83
,类型是 Linux
,这意味着这个分区可能是用于安装Linux操作系统或者存储Linux相关文件系统的数据。扇区是从磁盘读出和写入信息的最小单位,通常大小为512字节。 磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头 磁道(track)〉数:磁道是从盘片外圈往内圈编号0磁道,1磁道…,靠近主轴的同心圆用于停靠磁头,不存储数据 柱面(cylinder)数:磁道构成柱面,数量上等同于磁道个数 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同圆盘(platter)数:就是盘片的数量 磁盘容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数细节:传动臂上的磁头是共进退的(这点比较重要,后面会说明)
柱面(cylinder),磁头(head),扇区(sector),显然可以定位数据了,这就是数据定位(寻址)方式之一,CHS寻址方式。
CHS寻址 对早期的磁盘非常有效,知道用哪个磁头,读取哪个柱面上的第几扇区就可以读到数据了。但是CHS模式支持的硬盘容量有限,因为系统用8bit来存储磁头地址,用10bit来存储柱面地址,用6bit来存储扇区地址,而一个扇区共有512Byte,这样使用CHS寻址一块硬盘最大容量为256* 102463512B= 8064 MB(1MB=1048576B)(若按1MB=1000000B来算就是8.4GB)
磁带上⾯可以存储数据,我们可以把磁带“拉直”,形成线性结构
那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在⼀起的磁带,那么磁盘的逻辑存储结构我们也可以类似于:
这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA
⼀个细节:传动臂上的磁头是共进退的
柱⾯是⼀个逻辑上的概念,其实就是每⼀⾯上,相同半径的磁道逻辑上构成柱⾯。所以,磁盘物理上分了很多⾯,但是在我们看来,逻辑上,磁盘整体是由“柱⾯”卷起来的。
所以,磁盘的真实情况是: 磁道: 某⼀盘⾯的某⼀个磁道展开:
即:⼀维数组 柱⾯: 整个磁盘所有盘⾯的同⼀个磁道,即柱⾯展开:
整个磁盘不就是多张二维的扇区数组表(三维数组? )
所有,寻址一个扇区︰先找到哪一个柱面(Cylinder) ,在确定柱面内哪一个磁道(其实就是磁头位置,Head),在确定扇区(Sector),所以就有了CHS.
我们之前学过C/C++的数组,在我们看来,其实全部都是一维数组:
所以,每⼀个扇区都有⼀个下标,我们叫做LBA(LogicalBlockAddress)地址,其实就是线性地址。所以 怎么计算得到这个LBA地址呢?
LBA,1000,CHS必须要! LBA地址转成CHS地址,CHS如何转换成为LBA地址。
OS只需要使⽤LBA就可以了!!LBA地址转成CHS地址,CHS如何转换成为LBA地址。谁做啊??磁盘 ⾃⼰来做!固件(硬件电路,伺服系统)
CHS转成LBA:
LBA转成CHS:
所以:从此往后,在磁盘使⽤者看来,根本就不关⼼CHS地址,⽽是直接使⽤LBA地址,磁盘内部⾃⼰ 转换。所以:
从现在开始,磁盘就是⼀个元素为扇区的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使⽤ 磁盘,就可以⽤⼀个数字访问磁盘扇区了。