-
-
[原创]Grub for dos bootloader 分析
-
发表于:
2009-9-3 17:43
7273
-
[原创]Grub for dos bootloader 分析
概述一下:
Grubfordos0.4.4的主题为三部分:MBR,bootloader,kernel
1:MBR对应的文件为stage1目录下的stage1.S .S后缀为GAS汇编源文件
Stage1:大小512字节,编译后的结构为DBR结构,这样的优点是,无论你将GRUB安装在MBR还是分区的DBR中,都能正常引导,如果安装在硬盘的MBR中,那么bios的int19号中断会MBR中的内容读入到内存0x7C00处,而stage1的功能只是为了将start.S编译后存放在MBR 1(LBA)扇区的地方二进制文件载入内存的0x8000处后跳转到该处执行,当然,在载入内存之前使用bios的int13号中断,或者int 13扩展调用读到缓冲区后在拷贝到相应的内存地址处;
2:bootload 对应文件start.S
由start1载入到内存0x8000处的代码功能充当bootload的功能,之所以不写在stage1中,是受硬盘每扇区存储字节数的限制,而MBR除引导代码外还保存有分区表信息,因此,MBR中可用的字节数就更少了,而DBR中还应该保持BPB数据结构类型,故此,将loader单独编译一个扇区是情有可言的;s
Start的功能:
在末尾-8偏移的地方保存有stage2存放的扇区号(LBA)以及大小,start1只是将对应kernel载入内存地址0x8200处,因为start编译后大小为512字节,故此占了0x200,当stage2被载入完成后,就jmp到0x8200处执行,这时,真正的Grub代码才开始;
Stage2: 相当于一个小型的操作系统,grub提供多引导支持,grub对文件系统的支持较为全面,而一个操作系统,最复杂而核心的部分恐怕在于文件系统的实现上,故此,分析grub,
无论是对想了解操作系统原理还是文件系统原理的人来说,应该有一定的帮助;
关于地址转换:
扇区的编号和线性地址:
由于int 13的限制,三维地址C/H/S的最大值为1024/16/63,因此容量只能达到:1024*16*63*512Byte=504MB;故因此系统把所有的无聊扇区都按某种方式或规则看做是线性编号的扇区,从0到某一最大值;
扇区编号:
C/H/S : 扇区编号从1开始至63
LBA : 扇区编号从0开始顺序编号
C/H/S到线性地址的转换:
C : 当前柱面号 CS:起始柱面号
H : 当前磁头号 HS:起始磁头号
S : 当前扇区号 SS:起始扇区号
PH: 每柱面有多少个磁道
PS: 每磁道有多少个扇区
则有公式: LBA = ( C - CS)*PH*PS +(H - HS)*PS + (S - SS)
一般情况下: CS = 0 HS = 0 SS = 1 PS = 63 PH = 255
而LBA到C/H/S的转换稍微复杂一些,各变量按上述,有如下公式:
C = LBA div (PH*PS) + CS
H = (LBA div PS) MOD PH + HS
S = LBA MOD PS + SS
如果只用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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)