CHS
什么是CHS寻址
很久以前, 硬盘的容量还非常小的时候,人们采用与软盘类似的结构生产硬盘。也就是硬盘盘片的每一条磁道都具有相同的扇区数。由此产生了所谓的CSH 3D参数 (Disk Geometry)。即磁头数(Heads),柱面数(Cylinders),扇区数(Sectors),以及相应CHS寻址方式。
CHS寻址模式将硬盘划分为磁头(Heads)、柱面(Cylinder)、扇区(Sector)。
磁头(Heads):每张磁片的正反两面各有一个磁头,一个磁头对应一张磁片的一个面。因此,用第几磁 头就可以表示数据在哪个磁面。
柱面(Cylinder):所有磁片中半径相同的同心磁道构成“柱面”,意思是这一系列的磁道垂直叠在一起,就形成一个柱面的形状。简单地理解,柱面数=磁道数。
扇区(Sector):将磁道划分为若干个小的区段,就是扇区。虽然很小,但实际是一个扇子的形状,故称为扇区。每个扇区的容量为512字节。
下面的图可能能更好的帮助理解:
CHS寻址的最大容量
CHS寻址方式的容量由CHS三个参数决定:
1.磁头数最大为255 (用 8 个二进制位存储)。从0开始编号。
2.柱面数最大为1023(用 10 个二进制位存储)。从0开始编号。
3.扇区数最大数 63(用 6个二进制位存储)。从1始编号。
所以CHS寻址方式的最大寻址范围为:
255 * 1023 * 63 * 512 / 1048576 = 7.837 GB ( 1M =1048576 Bytes )
或硬盘厂商常用的单位:
255 * 1023 * 63 * 512 / 1000000 = 8.414 GB ( 1M =1000000 Bytes )
为什么引入LBA概念?
首先,由于INT13的限制,三维地址C/H/S的最大值只能为1024/16/63,容量最大只能到1024X16X63 Byte=528482304 Byte=504 M。其次,在系统管理文件时记录繁琐的C/H/S也很吃力,效率较低,使用逻辑扇区后,可在硬盘读写操作时脱离柱面,磁头等硬件参数的制约。
在LBA模式下,系统把所有的物理扇区都按照某种方式或规则看做是一线性编号的扇区,即从0到某个最大值方式排列,并连成一条线,把LBA作为一个整体来对待,而不再是具体到实际的C/H/S值,这样只用一个序数就能确定一个唯一的物理扇区,这就是线性地址的由来,显然线性地址是物理扇区的逻辑地址。
LBA简介
磁盘读取发展
IO操作读取硬盘的三种方式:
chs方式 :小于8G (8064MB)
LBA28方式:小于137GB
LBA48方式:小于144,000,000 GB
LBA方式访问使用了data寄存器,LBA寄存器(总共3个),device寄存器,command寄存器来完成的。
LBA28和LBA48方式:
LBA28方式使用28位来描述一个扇区地址,最大支持128GB的硬磁盘容量。
LBA28的寄存器
寄存器端口作用data寄存器0x1F0已经读取或写入的数据,大小为两个字节(16位数据)
每次读取1个word,反复循环,直到读完所有数据features寄存器0x1F1读取时的错误信息
写入时的额外参数sector count寄存器0x1F2指定读取或写入的扇区数LBA low寄存器0x1F3lba地址的低8位LBA mid寄存器0x1F4lba地址的中8位LBA high寄存器0x1F5lba地址的高8位device寄存器0x1F6lba地址的前4位(占用device寄存器的低4位)
主盘值为0(占用device寄存器的第5位)
第6位值为1
LBA模式为1,CHS模式为0(占用device寄存器的第7位)
第8位值为1command寄存器0x1F7读取,写入的命令,返回磁盘状态
1 读取扇区:0x20 写入扇区:0x30
磁盘识别:0xEC
IDE通道1,读写0x1f0-0x1f7号端口
IDE通道2,读写0x170-0x17f号端口
CHS方式:
写0x1f1: 0
写0x1f2: 要读的扇区数
写0x1f3: 扇区号W
写0x1f4: 柱面的低8位
写0x1f5: 柱面的高8位
写0x1f6: 7~5位,101,第4位0表示主盘,1表示从盘,3~0位,磁头号
写0x1f7: 0x20为读, 0x30为写
读0x1f7: 第4位为0表示读写完成,否则要一直循环等待
读0x1f0: 每次读取1个word,反复循环,直到读完所有数据
24-bit LBA方式:
写0x1f1: 0
写0x1f2: 要读的扇区数
写0x1f3: LBA参数的0~7位
写0x1f4: LBA参数的8~15位
写0x1f5: LBA参数的16~23位
写0x1f6: 7~5位,111,第4位0表示主盘,1表示从盘,3~0位,LBA参数的24~27位
写0x1f7: 0x20为读, 0x30为写
读0x1f7: 第4位为0表示读写完成,否则要一直循环等待
读0x1f0: 每次读取1个word,反复循环,直到读完所有数据
48-bit LBA方式:
写两次0x1f1端口: 0
写两次0x1f2端口: 第一次要读的扇区数的高8位,第二次低8位
写0x1f3: LBA参数的24~31位
写0x1f3: LBA参数的0~7位
写0x1f4: LBA参数的32~39位
写0x1f4: LBA参数的8~15位
写0x1f5: LBA参数的40~47位
写0x1f5: LBA参数的16~23位
写0x1f6: 7~5位,010,第4位0表示主盘,1表示从盘,3~0位,0
写0x1f7: 0x24为读, 0x34为写
LBA和CHS的的对应关系
虽然LBA和CHS的两种定位方式不同,但其实两者间还是有一个转换关系的。
首先要了解线性地址的编码规则:把第一柱面(0柱面)第一磁头(0面)第一扇区(1扇区)编为逻辑“0”扇区。。。。。。直到第一柱面(0柱面)第一磁头(0面)的第63扇区(63扇区),将其编为第“63”扇区,这样编码。
(1)从C/H/S到LBA
用C表示当前柱面号,H表示当前磁头号,S表示当前扇区号,CS表示起始柱面号,HS表示起始磁头号,SS表示起始扇区号,PS表示每磁道有多少个扇区,PH表示每柱面有多少个磁道,计算公式如下:
LBA = ( C – CS ) * PH * PS + ( H – HS ) * PS + ( S – SS )
例如:
C/H/S=0/01 则 LBA = 0
C/H/S=0/0/63 则 LBA = 62
C/H/S=0/1/1 则 LBA = 63
C/H/S=0/5/1 则 LBA = 315
C/H/S=100/0/1 则 LBA = 1606500
C/H/S=100/1/1 则 LBA = 1606563
C/H/S=139/52/48 则 LBA = 2236358
C/H/S=220/156/18则 LBA = 3544145
(2)从LBA到C/H/S
变量命名依然同上,则计算公式如下
C = LBA DIV ( PH * PS ) + CS
H = ( LBA DIV PS ) MOD PH + HS
S = LBA MOD PS + SS
如果不运行MOD运算符,只用DIV运算符,则:
C = LBA DIV ( PH * PS ) + CS
H = LBA DIV PS – ( C – CS ) * PH + HS
S = LBA – ( C – CS ) * PH * PS – H – HS)* PS + SS
例如:
LBA=0 则 C/H/S = 0/0/1
LBA=62 则 C/H/S = 0/0/63
LBA=63 则 C/H/S = 0/1/1
LBA=315 则 C/H/S = 0/5/1
LBA=1606500 则 C/H/S = 100/0/1
LBA=2236358 则 C/H/S = 139/52/48
LBA=3544145 则 C/H/S = 220/156/18