上一篇文章《Linux存储-硬盘的类型和命名规则》描述了硬盘的类型按材质可以分为机械硬盘和固态硬盘。那么Linux操作系统是以什么方式对硬盘进行读写的呢?先说结论:以扇区为单位对硬盘进行读写数据。
什么是扇区
扇区既有硬件物理概念,也有逻辑概念,也就是说物理扇区是硬件参数,逻辑扇区是协议参数。从操作系统角度来看,固态硬盘和机械硬盘一样都是块设备,都按 512B 或者4KB逻辑扇区寻址。
物理扇区
传统机械硬盘才是真实物理扇区。机械硬盘主要由磁头、盘片、柱面、磁道等组成,采用CHS(柱面号(Cylinder) +磁头号(Header) + 扇区号(Sector) 寻址方式定位一个物理扇区,通常是512B。
逻辑扇区
固态硬盘没有磁头、盘片、柱面这些概念,而是由页(最小读取单位,通常是4kB-16kB)、块(由多个页组成)、平面或者晶片(多个块组成)组成,但硬盘接口与协议仍沿用扇区逻辑,采用LBA一位逻辑编号标识。操作系统下发LBA编号后,固态硬盘里的控制器会通过(FTL文件转换层)进行转换。
什么是LBA
LBA是逻辑块寻址(Logical Block Address),操作系统把整块硬盘从头到尾按扇区依次编号,从 0 开始,以LBA0、LBA1、LBA2数字类推。每个编号就是一个 LBA 地址,一个LBA默认对应1个扇区(常见512 字节/ 4KB)。LBA0就是整块硬盘的第1个逻辑扇区,硬盘最开头的第一个512 字节,不管是机械盘还是固态硬盘,LBA0 永远是硬盘的最开头。
通常如果采用MBR分区表则LBA0整个就是主引导记录MBR(引导代码+分区表+55AA标志)。如果采用GPT分区表则LBA0依然保留一个保护性MBR,防止使用旧的分区工具时误删GPT分区表,真正的GPT表头从LBA1开始。
也就是说硬盘主控组件内部会做自动转换,操作系统下发LBA地址→硬盘主控自动翻译成物理CHS或者闪存物理单元→完成读写,操作系统永远只用LBA,不用关心硬盘物理结构是怎么样的。
操作系统对硬盘的读写流程
机械硬盘读写流程:
1.操作系统下发LBA地址
2.硬盘控制器将LBA转换为CHS 物理地址
3.磁头臂移动到目标柱面、磁道
4.盘片旋转等待目标扇区转到磁头下
5.磁头感应将磁信号转为电信号
6.ECC校验纠错并将数据传回操作系统
固态硬盘读写流程:
1.操作系统下发LBA 地址(和机械硬盘完全一样)
2.固态硬盘主控器通过FTL映射表将LBA转换对应物理块、页、晶片
3.电路直接选中目标闪存页
4.读取晶体管电荷状态解析为0/1信号
5.ECC纠错、缓存调度传回操作系统
固态硬盘和机械硬盘读写区别:
名称 | 机械硬盘 | 固态硬盘 |
LBA | LBA->CHS->物理 | LBA->FTL->物理 |
时延 | 毫秒级 | 微妙级 |
读取方式 | 机械运动,电磁感应 | 电路读取 |
物理地址 | CHS(柱面、磁头、扇区) | 晶片、块、页 |
寻址单元 | 扇区512B或者4kB | 页,4kB-16KB |
存储介质 | 盘片 | NAND闪存 |
Linux查看扇区大小的方法
# Linux查看逻辑扇区大小cat/sys/block/sda/queue/physical_block_size (sda根据实际)# Linux查看物理扇区大小cat/sys/block/sda/queue/logical_block_size(sda根据实际)
核心点
传统机械硬盘以512B为扇区,现代新硬盘尤其是固态硬盘大多是4KB为扇区。
系统对硬盘读写必须按整扇区操作,哪怕只改1个字节数据,系统也会读整个扇区,修改,整个扇区写回。
操作系统、分区表、磁盘坏道、dd读写、磁盘寻址都是按LBA编号定位扇区。
不管是机械硬盘还是固态硬盘,只要使用MBR分区表,LBA0都是第一个扇区存MBR。
操作系统、BIOS/UEFI不感知硬盘的结构是固态盘还是机械盘。