Wednesday, December 23, 2009

grub的stage1.5

个人电脑使用LVM过程碰到问题, 体现出对grub的不理解. 也体现出对硬盘结构的不理解

stage1.5这个阶段一般不怎么提的. 这往往是事情最重要的一个环节. 每个stage的作用:
1. stage1, 就是在所谓的MBR空间里, 最大长度为446bytes. 这些代码可以知道分区的始与终, 知道下一个stage的物理位置. 会跳到那里去
2. stage2, 在文件系统上去. 它拥有读懂文件系统的能力. 主要任务: 加载kernel

这里就存在一个大问题: stage1是不懂得文件系统的(只有长度为446bytes就可以懂到文件系统的代码就是神奇的代码), 它怎么把CPU交给stage2呢?

这里就需要stage1.5的帮助. stage1.5是懂得文件系统. 也就是它可以把CPU交给stage2.



这个过程的关键一点就是stage1.5. 但是: stage1.5是存放在哪里的呢?

先对硬盘结构来一次回顾

fdisk的参数看起:

jessinio@jessinio-laptop:~$ sudo fdisk -l /dev/sda

Disk /dev/sda: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00038329

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         100      803218+  83  Linux
/dev/sda2             101       30401   243392782+  8e  Linux LVM

几个名词:head, sector, cylinder, block

这几个概念当与硬盘结构对应起来时, 就有点点问题。 特别是head这个概念。现在的硬盘哪里有255个head?这是不可能的!你看过这么厚的硬盘吗?

这里也没有255个head。255个是多少呢?看:


所以!head数目是与物理磁头的数目不对应的。它有什么用处呢?

硬盘数据的寻址方式

早期的硬盘是可以按照数据存放的几何位置寻址,三个数据简称:CHS
后期硬盘发展明显不是这样的。但是为了兼容,三个概念还是保留下来。并映射成一种新的寻址方式:LBA
每一块可以被寻址的位置被称为:block
一般每一块block的大小都是512bytes

保留地址

从CHS到LBA的转算公式:
  • C, H and S are the cylinder number, the head number, and the sector number
  • LBA is the logical block address
  • HPC is the number of heads per cylinder
  • SPT is the number of sectors per track
  • * 来自http://en.wikipedia.org/wiki/Logical_block_addressing
一般, HPC等于H, SPT等于S

可以看出, S是从1开始的(不可能为0的). 也就是说: 0 sector没有被使用! 这样就有 sector * 512 bytes的空间是没有划分到分区中!
其中, head为0, sector为0时, 叫MBR.

还有( sector - 1 ) * 512的空间做什么呢?

刚好, 被用来放stage1.5!

因为保留的空间的大小也有限的. 也就是说: 不能把常用的文件系统驱动都带有. 实现方法是:
* 每种boot分区文件系统有指定的stage1.5文件!

例如: e2fs_stage1_5, fat_stage1_5, ffs_stage1_5, jfs_stage1_5,
minix_stage1_5,
reiserfs_stage1_5, vstafs_stage1_5, xfs_stage1_5


不同的文件系统有不同的stage1.5文件.

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.