接觸unix/unix like的東西已經有一段時間了, 在一台機器上裝多個系統是避免不了的. 有時候經常被bootloader弄得很苦惱. 如果你在安裝系統或者lilo的時候不小心選擇錯了, 系統間的bootloader經常相互覆蓋. 衆所周知, 在unix/unix like世界裏沒有誰能統治誰. 於是我就在想能不能找到一個單獨的, 與系統無關的bootloader, 這個東西的作用只是在mbr中來引導其他系統自己的bootloader些且不需要向grub那樣有很多的功能. 不知道我的想法是不是很愚蠢
回复于:2005-06-17 09:30:06
不太明白,bootloader好像本身就与系统无关吧?我想你的问题主要还是对这些东东了解不够!
回复于:2005-06-17 10:03:00
bootloader 是通过写在 MBR 中的一段代码激发的
系统启动的时候,BIOS 先要检测硬盘,当发现硬盘 0 道 0 面 1 扇区的最后两个字节为 55 AA 的时候,将该扇区数据载入 0x7c00 物理地址,然后开始运行里面的程序
那个扇区里前半部分是引导程序,后面是硬盘的 4 个主分区表,引导程序负责再载入其他引导程序,例如 bootloader 等,然后将其移动到内存高端地址,其后做一个跳转,将控制权向下转交
回复于:2005-06-17 10:07:54
除了第一个系统,其他的系统都可以选择把boot loader装在自己的分区上,而不是mbr上(windows除外)。这样可以每装一个新系统,都去修改一下第一个系统的boot loader 的设置就可以了。
回复于:2005-06-17 10:09:37
引用:原帖由 "sakulagi"]除了第一个系统,其他的系统都可以选择把boot loader装在自己的分区上,而不是mbr上(windows除外)。这样可以每装一个新系统,都去修改一下第一个系统的boot loader 的设置就可以了。 发表:
其实 windows 也是将实际的 WIN 引导部分写在自己逻辑分区的 1 扇区上面的,如果用 debug 载入 0 道 0 面 1 扇区后就可以得到证实,MBR 的部分只不过是一个“跳板”
回复于:2005-06-17 10:15:03
引用:原帖由 "platinum" 发表: bootloader 是通过写在 MBR 中的一段代码激发的
系统启动的时候,BIOS 先要检测硬盘,当发现硬盘 0 道 0 面 1 扇区的最后两个字节为 55 AA 的时候,将该扇区数据载入 0x7c00 物理地址,然后开始运行里面的程序
那?.........
偶像,我刚刚学LINUX时,看到有人曾把版主的这个地址表拿出来讲课,当时我很晕,现在听来,明白了一些
强
回复于:2005-06-17 10:31:31
引用:原帖由 "platinum" 发表:
其实 windows 也是将实际的 WIN 引导部分写在自己逻辑分区的 1 扇区上面的,如果用 debug 载入 0 道 0 面 1 扇区后就可以得到证实,MBR 的部分只不过是一个“跳板”
主要是windows安装的时候一定要把自己的”跳板“写在MBR里,然后指向自己的分区。这点不是很爽。
回复于:2005-06-17 10:58:11
引用:原帖由 "sakulagi" 发表:
主要是windows安装的时候一定要把自己的”跳板“写在MBR里,然后指向自己的分区。这点不是很爽。
是呀是呀 :D
不过好像所有的 OS 几乎都是用同一个“跳板”,真正自己的引导程序在自己的逻辑分区的第一个扇区上
一些早期的引导型病毒,以及某些 bootloader,还有些硬盘加密卡,他们会修改 MBR,做个“钩子”出来
回复于:2005-06-17 11:00:11
引用:原帖由 "sakulagi"]主要是windows安装的时候一定要把自己的”跳板“写在MBR里,然后指向自己的分区。这点不是很爽。 发表:
9494,这点不爽。
而且还要自动激活 windows 分区。
其实我发现,先装 linux,再装 windows,那么 windows 的 MBR 程序(注意不是 BOOT RECORD)也可以引导 linux。
方法就是在 windows 的磁盘管理器中将 linux 的 grub 所在分区设置成活动分区就可以了。
回复于:2005-06-17 11:04:01
MBR 是哪个操作系统装的并不重要,
因为 MBR 还算是有规范的:最终都会跳到活动分区的 BOOT RECORD 中去,
所以,只需要将 boot loader 写到自己的 BOOT RECORD 中,然后再设置好活动分区,就不怕有多少个操作系统了。
我一般都是 MBR 到 grub,然后用 grub 引导多系统。
我从不把 grub 写到 MBR,就是怕 windows 搞坏它。
回复于:2005-06-17 11:29:26
引用:原帖由 "flw" 发表: MBR 是哪个操作系统装的并不重要,
因为 MBR 还算是有规范的:最终都会跳到活动分区的 BOOT RECORD 中去,
所以,只需要将 boot loader 写到自己的 BOOT RECORD 中,然后再设置好活动分区,就不怕有多少个操作系统..........
我一般都是 MBR 到 grub,然后用 grub 引导多系统。
我从不把 grub 写到 MBR,就是怕 windows 搞坏它。
这两句不懂
mbr到grub和grub到mbr有什么区别??? 偶像
回复于:2005-06-17 12:36:58
我一般都是 MBR 到 grub,然后用 grub 引导多系统。
我从不把 grub 写到 MBR,就是怕 windows 搞坏它。
我也看不懂~
~~~~~~~~~~~
我的个人理解(有疑问大家可以一起讨论):
呵呵~~~ mbr只是一个指针,mbr说跳到哪里执行就从哪里执行.
这个哪里执行,其实就是一个os loader (也是一个程序)的位置,或者就是直接的os的启动代码位置,负责把os引导起来.
grub是一个os loader,lilo也是一个os loader,nt也有一个load,好像叫什么 xxx load,忘记了~~
os loader和操作系统无关~~~~
不过os loader的位置和是否可以启动os有关,因为bios只能读到8g硬盘前的数据(os loader没有载入之前,硬件是bios控制的),os loader别装太后面(8g后面),至于os的启动文件在哪里就没有8g的限制,因为grub载入后可以读到整个硬盘的数据了~~~
回复于:2005-06-17 12:46:51
引用:原帖由 "glider126" 发表:
因为bios只能读到8g硬盘前的数据(os loader没有载入之前,硬件是bios控制的)
BIOS 用中断 0x13
MBR 里面也调用中断 0x13
MBR 是一个标准,几乎所有硬盘里面的 MBR(除了分区表)都是一样的,BIOS 都是把把硬盘的物理第 1 扇区载入内存,然后 MBR 跳转到到某个逻辑分区的引导程序上来完成引导的
好了,问题出来了,BIOS 是用 0x13,而且调用的就是 BIOS 的 0x13,因此恐怕说“因为bios只能读到8g硬盘前的数据”是错误的 :em11:
回复于:2005-06-17 13:43:26
>;>;>;mbr只是一个指针
================
MBR 是 Master Boot Record 的简称。
主引导记录,也是机器控制权交给用户程序的唯一入口。
回复于:2005-06-17 15:17:35
The Interrupt 13h interface
When IBM engineered the AT they put the interface for the harddisk (Int 13h) in the system BIOS.
Whenever an application wants to read from/write to a drive, it calls DOS.
DOS knows the structure of the disk and where the target file is located. It then calculates a CHS (Cylinder, Head, Sector) address and calls the BIOS via Int 13h.
The BIOS then executes the read or write command at this CHS address by accessing the HD controller directly via its I/O-port addresses.
The result is passed back to DOS who passes it back to the application.
This scheme makes DOS (drive) hardware independent and leaves the hardware specifics to the BIOS.
The traditional BIOS Int 13h interface has the following limitations (when called from DOS):
1024 Cylinders, 256 Heads and 63 Sectors/track.
With 512 bytes/sector this counts up to 8 GB (8064 MB)!
回复于:2005-06-17 15:33:47
int 13h 有扩展入口,可以读写 8G 以上的空间
回复于:2005-06-17 16:16:58
platinum :
/dev/hda1 / 20g
/dev/hda2 /boot 100m
/dev/hda3 swap 256m
grub装在/boot里
请问,这个系统可以使用grub引导启动linux吗?
回复于:2005-06-17 16:24:11
MBR ->; 某个逻辑区的引导信息(一般是第一个)
在你这里,就是指的 / ,如果你的 MBR 指向的是 /boot,那么你就能引导,否则会用 / 的引导信息引导,就会报错
换句话说,即使是普通的 MBR(未经特殊修改), /boot 是 hda1,而 / 是 /hda2,那么也能引导
以上仅是理论分析,曾经看过 MBR 的一些资料,对里面的数据结构有所了解,但不知用来解释这个是否正确,还请指正
回复于:2005-06-17 16:33:10
引用:原帖由 "flw" 发表: >;>;>;mbr只是一个指针
================
MBR 是 Master Boot Record 的简称。
主引导记录,也是机器控制权交给用户程序的唯一入口。
有一点了解,不知我理解的对不对
正常应是mbr交给kernel
而现在是mbr交给grub
再由grub交给kernel
可以这样理解吗
回复于:2005-06-17 17:11:06
到底谁能权威的、通俗的把boot loader的过程解释一下啊?
回复于:2005-06-17 17:12:49
引用:原帖由 "风流涕淌" 发表: 有一点了解,不知我理解的对不对
正常应是mbr交给kernel
而现在是mbr交给grub
再由grub交给kernel
可以这样理解吗
MBR 根本就不管什么内核不内核的,它不懂这个,你说了它还是不懂。
它只知道简单地查表,查分区表,分区表一般是 64 个字节,每条记录 16 个字节,共 4 条记录。到网上找找,有分区表的记录格式。
分区表的每条记录记录了以下信息:
分区起始扇区、分区终止扇区、分区类型、活动分区标志。等等。
MBR 会查找活动分区标志,活动分区应该只有一个,找到后,MBR 会根据分区表的记录信息,找到那个分区,并且将其逻辑 0 扇区(Boot Record)载入内存,也就是 0x7c00,然后执行 jump 0x07c0:0000 就将控制权交给 Boot Record 了。
Boot Record 一般就是 OS LOADER,比如 linux 的 bootsect.s,或者 MS-DOS 的 boot.asm,但是现在的操作系统的大多都允许别的操作系统和它并存,因此,各个厂商就开发了自己的 OS LOADER 用来装载多个操作系统。
比如 SCO 的 boot 冒号提示符就可以引导多个操作系统,linux 则奉行一贯的拿来主义,采用了 grub,lilo 等。windows 也有自己的 OS LOADER,不过对非 MS 系统不太友好而已。
OS LOADER 接受用户选择,然后再次载入用户选择操作系统的 LOADER,比如 linux 的 boot/bootsect.s 就是。
当然了,grub lilo 等多操作系统引导程序本身不去判断将要载入的是什么程序(其实什么程序都一样,都是一段汇编),因此,在我的机器上,grub 可以跳到 SCO 的 boot:,然后我还可以跳回来再跳到 grub,总之道理明白了就好理解了。
回复于:2005-06-17 18:36:40
这个是我收藏的。
硬盘、分区引导和操作系统加载程序
(4458 个字於此篇帖子)
(已阅读: 2484 次)
发信人: suzhe (I Love Linux), 信区: FreeDevelop
标 题: HardDisk,Partition,Boot,OSLoader专题
发信站: BBS 水木清华站 (Sat Nov 20 16:45:44 1999)
第一部分 简 介
1,1
一. 硬盘结构简介
1. 硬盘参数释疑
到目前为止, 人们常说的硬盘参数还是古老的 CHS (Cylinder/
Head/Sector)参数. 那么为什么要使用这些参数, 它们的意义是什么?
它们的取值范围是什么?
很久以前, 硬盘的容量还非常小的时候, 人们采用与软盘类似的结
构生产硬盘. 也就是硬盘盘片的每一条磁道都具有相同的扇区数. 由此
产生了所谓的3D参数 (Disk Geometry). 既磁头数(Heads), 柱面数
(Cylinders), 扇区数(Sectors),以及相应的寻址方式.
其中:
磁头数(Heads) 表示硬盘总共有几个磁头,也就是有几面盘片, 最大
为 255 (用 8 个二进制位存储);
柱面数(Cylinders) 表示硬盘每一面盘片上有几条磁道, 最大为 1023
(用 10 个二进制位存储);
扇区数(Sectors) 表示每一条磁道上有几个扇区, 最大为 63 (用 6
个二进制位存储).
每个扇区一般是 512个字节, 理论上讲这不是必须的, 但好象没有取
别的值的.
所以磁盘最大容量为:
255 * 1023 * 63 * 512 / 1048576 = 8024 GB ( 1M = 1048576 Bytes )
或硬盘厂商常用的单位:
255 * 1023 * 63 * 512 / 1000000 = 8414 GB ( 1M = 1000000 Bytes )
在 CHS 寻址方式中, 磁头, 柱面, 扇区的取值范围分别为 0 到 Heads - 1,
0 到 Cylinders - 1, 1 到 Sectors (注意是从 1 开始).
2. 基本 Int 13H 调用简介
BIOS Int 13H 调用是 BIOS 提供的磁盘基本输入输出中断调用, 它可以
完成磁盘(包括硬盘和软盘)的复位, 读写, 校验, 定位, 诊断, 格式化等功能.
它使用的就是 CHS 寻址方式, 因此最大识能访问 8 GB 左右的硬盘 ( 本文中
如不作特殊说明, 均以 1M = 1048576 字节为单位).
3. 现代硬盘结构简介
在老式硬盘中, 由于每个磁道的扇区数相等, 所以外道的记录密度要远低
于内道, 因此会浪费很多磁盘空间 (与软盘一样). 为了解决这一问题, 进一
步提高硬盘容量, 人们改用等密度结构生产硬盘. 也就是说, 外圈磁道的扇区
比内圈磁道多. 采用这种结构后, 硬盘不再具有实际的3D参数, 寻址方式也改
为线性寻址, 即以扇区为单位进行寻址.
为了与使用3D寻址的老软件兼容 (如使用BIOS Int13H接口的软件), 在硬
盘控制器内部安装了一个地址翻译器, 由它负责将老式3D参数翻译成新的线性
参数. 这也是为什么现在硬盘的3D参数可以有多种选择的原因 (不同的工作模
式, 对应不同的3D参数, 如 LBA, LARGE, NORMAL).
4. 扩展 Int 13H 简介
虽然现代硬盘都已经采用了线性寻址, 但是由于基本 Int 13H 的制约, 使
用 BIOS Int 13H 接口的程序, 如 DOS 等还只能访问 8 G 以内的硬盘空间.
为了打破这一限制, Microsoft 等几家公司制定了扩展 Int 13H 标准
(Extended Int13H), 采用线性寻址方式存取硬盘, 所以突破了 8 G 的限制,
而且还加入了对可拆卸介质 (如活动硬盘) 的支持.
二. Boot Sector 结构简介
1. Boot Sector 的组成
Boot Sector 也就是硬盘的第一个扇区, 它由 MBR (Master Boot Record),
DPT (Disk Partition Table) 和 Boot Record ID 三部分组成.
MBR 又称作主引导记录占用 Boot Sector 的前 446 个字节 ( 0 to 0x1BD ),
存放系统主引导程序 (它负责从活动分区中装载并运行系统引导程序).
DPT 即主分区表占用 64 个字节 (0x1BE to 0x1FD), 记录了磁盘的基本分区
信息. 主分区表分为四个分区项, 每项 16 字节, 分别记录了每个主分区的信息
(因此最多可以有四个主分区).
Boot Record ID 即引导区标记占用两个字节 (0x1FE and 0x1FF), 对于合法
引导区, 它等于 0xAA55, 这是判别引导区是否合法的标志.
Boot Sector 的具体结构如下图所示 (参见 NightOwl 大侠的文章):
0000 |------------------------------------------------|
| |
| |
| Master Boot Record |
| |
| |
| 主引导记录(446字节) |
| |
| |
| |
01BD | |
01BE |------------------------------------------------|
| |
01CD | 分区信息 1(16字节) |
01CE |------------------------------------------------|
| |
01DD | 分区信息 2(16字节) |
01DE |------------------------------------------------|
| |
01ED | 分区信息 3(16字节) |
01EE |------------------------------------------------|
| |
01FD | 分区信息 4(16字节) |
|------------------------------------------------|
| 01FE | 01FF |
| 55 | AA |
|------------------------------------------------|
2. 分区表结构简介
分区表由四个分区项构成, 每一项的结构如下:
BYTE State : 分区状态, 0 = 未激活, 0x80 = 激活 (注意此项)
BYTE StartHead : 分区起始磁头号
WORD StartSC : 分区起始扇区和柱面号, 底字节的低6位为扇区号,
高2位为柱面号的第 9,10 位, 高字节为柱面号的低 8 位
BYTE Type : 分区类型, 如 0x0B = FAT32, 0x83 = Linux 等,
00 表示此项未用
BYTE EndHead : 分区结束磁头号
WORD EndSC : 分区结束扇区和柱面号, 定义同前
DWORD Relative : 在线性寻址方式下的分区相对扇区地址
(对于基本分区即为绝对地址)
DWORD Sectors : 分区大小 (总扇区数)
注意: 在 DOS / Windows 系统下, 基本分区必须以柱面为单位划分
( Sectors * Heads 个扇区), 如对于 CHS 为 764/255/63 的硬盘, 分区的
最小尺寸为 255 * 63 * 512 / 1048576 = 7.844 MB.
3. 扩展分区简介
由于主分区表中只能分四个分区, 无法满足需求, 因此设计了一种扩展
分区格式. 基本上说, 扩展分区的信息是以链表形式存放的, 但也有一些特
别的地方.
首先, 主分区表中要有一个基本扩展分区项, 所有扩展分区都隶属于它,
也就是说其他所有扩展分区的空间都必须包括在这个基本扩展分区中. 对于
DOS / Windows 来说, 扩展分区的类型为 0x05.
除基本扩展分区以外的其他所有扩展分区则以链表的形式级联存放, 后
一个扩展分区的数据项记录在前一个扩展分区的分区表中, 但两个扩展分区
的空间并不重叠.
扩展分区类似于一个完整的硬盘, 必须进一步分区才能使用. 但每个扩
展分区中只能存在一个其他分区. 此分区在 DOS/Windows 环境中即为逻辑盘.
因此每一个扩展分区的分区表 (同样存储在扩展分区的第一个扇区中)中最多
只能有两个分区数据项(包括下一个扩展分区的数据项).
扩展分区和逻辑盘的示意图如下:
|-----------------------| --------
| 主扩展分区(/dev/hda2) | ^
|-----------------------| |
| 扩 展 | 分区项 1 |-- |
| |------------| | |
| 分区表 | 分区项 2 |--+-- |
|-----------------------| | | |
| | | | |
| 逻辑盘 1 (/dev/hda5) |<-/ | |
| | | |
|-----------------------| | 主
| 扩展分区 2 |<----/
|-----------------------| 扩
| 扩 展 | 分区项 1 |--
| |------------| | 展
| 分区表 | 分区项 2 |--+--
|-----------------------| | | 分
| | | |
| 逻辑盘 2 (/dev/hda6) |<-/ | 区
| | | |
|-----------------------| | |
| 扩展分区 3 |<----/ |
|-----------------------| |
| 扩 展 | 分区项 1 |-- |
| |------------| | |
| 分区表 | 分区项 2 | | |
|-----------------------| | |
| | | |
| 逻辑盘 3 (/dev/hda7) |<-/ |
| | |
|-----------------------| ---------
三. 系统启动过程简介
系统启动过程主要由一下几步组成(以硬盘启动为例):
1. 开机 :-)
2. BIOS 加电自检 ( Power On Self Test -- POST )
内存地址为 0ffff:0000
3. 将硬盘第一个扇区 (0头0道1扇区, 也就是Boot Sector)
读入内存地址 0000:7c00 处.
4. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于
则转去尝试其他启动介质, 如果没有其他启动介质则显示
"No ROM BASIC" 然后死机.
5. 跳转到 0000:7c00 处执行 MBR 中的程序.
6. MBR 首先将自己复制到 0000:0600 处, 然后继续执行.
7. 在主分区表中搜索标志为活动的分区. 如果发现没有活动
分区或有不止一个活动分区, 则转停止.
8. 将活动分区的第一个扇区读入内存地址 0000:7c00 处.
9. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于则
显示 "Missing Operating System" 然后停止, 或尝试
软盘启动.
10. 跳转到 0000:7c00 处继续执行特定系统的启动程序.
11. 启动系统 ...
以上步骤中 2,3,4,5 步是由 BIOS 的引导程序完成. 6,7,8,9,10
步由MBR中的引导程序完成.
一般多系统引导程序 (如 SmartFDISK, BootStar, PQBoot 等)
都是将标准主引导记录替换成自己的引导程序, 在运行系统启动程序
之前让用户选择要启动的分区.
而某些系统自带的多系统引导程序 (如 lilo, NT Loader 等)
则可以将自己的引导程序放在系统所处分区的第一个扇区中, 在 Linux
中即为 SuperBlock (其实 SuperBlock 是两个扇区).
注: 以上各步骤中使用的是标准 MBR, 其他多系统引导程序的引导
过程与此不同.
第二部分 技术资料
第一章 扩展 Int13H 技术资料
一. 简介
设计扩展 Int13H 接口的目的是为了扩展 BIOS 的功能, 使其支持
多于1024柱面的硬盘, 以及可移动介质的琐定, 解锁及弹出等功能.
二. 数据结构
1. 数据类型约定
BYTE 1 字节整型 ( 8 位 )
WORD 2 字节整型 ( 16 位 )
DWORD 4 字节整型 ( 32 位 )
QWORD 8 字节整型 ( 64 位 )
2. 磁盘地址数据包 Disk Address Packet (DAP)
DAP 是基于绝对扇区地址的, 因此利用 DAP, Int13H 可以轻松地逾
越 1024 柱面的限制, 因为它根本就不需要 CHS 的概念.
DAP 的结构如下:
struct DiskAddressPacket
{
BYTE PacketSize; // 数据包尺寸(16字节)
BYTE Reserved; // ==0
WORD BlockCount; // 要传输的数据块个数(以扇区为单位)
DWORD BufferAddr; // 传输缓冲地址(segment:offset)
QWORD BlockNum; // 磁盘起始绝对块地址
};
PacketSize 保存了 DAP 结构的尺寸, 以便将来对其进行扩充. 在
目前使用的扩展 Int13H 版本中 PacketSize 恒等于 16. 如果它小于
16, 扩展 Int13H 将返回错误码( AH=01, CF=1 ).
BlockCount 对于输入来说是需要传输的数据块总数, 对于输出来说
是实际传输的数据块个数. BlockCount = 0 表示不传输任何数据块.
BufferAddr 是传输数据缓冲区的 32 位地址 (段地址:偏移量). 数据
缓冲区必须位于常规内存以内(1M).
BlockNum 表示的是从磁盘开始算起的绝对块地址(以扇区为单位),
与分区无关. 第一个块地址为 0. 一般来说, BlockNum 与 CHS 地址的关系
是:
BlockNum = cylinder * NumberOfHeads +
head * SectorsPerTrack +
sector - 1;
其中 cylinder, head, sector 是 CHS 地址, NumberOfHeads 是磁盘
的磁头数, SectorsPerTrack 是磁盘每磁道的扇区数.
也就是说 BlockNum 是沿着 扇区->;磁道->;柱面 的顺序记数的. 这一顺
序是由磁盘控制器虚拟的, 磁盘表面数据块的实际排列顺序可能与此不同
(如为了提高磁盘速度而设置的间隔因子将会打乱扇区的排列顺序).
3. 驱动器参数数据包 Drive Parameters Packet
驱动器参数数据包是在扩展 Int13H 的取得驱动器参数子功能调用中
使用的数据包. 格式如下:
struct DriveParametersPacket
{
WORD InfoSize; // 数据包尺寸 (26 字节)
WORD Flags; // 信息标志
DWORD Cylinders; // 磁盘柱面数
DWORD Heads; // 磁盘磁头数
DWORD SectorsPerTrack; // 每磁道扇区数
QWORD Sectors; // 磁盘总扇区数
WORD SectorSize; // 扇区尺寸 (以字节为单位)
};
信息标志用于返回磁盘的附加信息, 每一位的定义如下:
0 位:
0 = 可能发生 DMA 边界错误
1 = DMA 边界错误将被透明处理
如果这位置 1, 表示 BIOS 将自动处理 DMA 边界错误, 也就是说
错误代码 09H 永远也不会出现.
1 位:
0 = 未提供 CHS 信息
1 = CHS 信息合法
如果块设备的传统 CHS 几何信息不适当的话, 该位将置 0.
2 位:
0 = 驱动器不可移动
1 = 驱动器可移动
3 位: 表示该驱动器是否支持写入时校验.
4 位:
0 = 驱动器不具备介质更换检测线
1 = 驱动器具备介质更换检测线
5 位:
0 = 驱动器不可锁定
1 = 驱动器可以锁定
要存取驱动器号大于 0x80 的可移动驱动器, 该位必须置 1
(某些驱动器号为 0 到 0x7F 的设备也需要置位)
6 位:
0 = CHS 值是当前存储介质的值 (仅对于可移动介质), 如果
驱动器中有存储介质, CHS 值将被返回.
1 = CHS 值是驱动器支持的最大值 (此时驱动器中没有介质).
7 - 15 位: 保留, 必须置 0.
三. 接口规范
1. 寄存器约定
在扩展 Int13H 调用中一般使用如下寄存器约定:
ds:di ==>; 磁盘地址数据包( disk address packet )
dl ==>; 驱动器号
ah ==>; 功能代码 / 返回码
在基本 Int13H 调用中, 0 - 0x7F 之间的驱动器号代表可移动驱动器
0x80 - 0xFF 之间的驱动器号代表固定驱动器. 但在扩展 Int13H 调用中
0x80 - 0xFF 之间还包括一些新出现的可移动驱动器, 比如活动硬盘等.
这些驱动器支持先进的锁定,解锁等功能.
ah 返回的错误码除了标准 Int13H 调用规定的基本错误码以外,又增加
了以下错误码:
B0h 驱动器中的介质未被锁定
B1h 驱动器中的介质已经锁定
B2h 介质是可移动的
B3h 介质正在被使用
B4h 锁定记数溢出
B5h 合法的弹出请求失败
2. API 子集介绍
1.x 版的扩展 Int13H 调用中规定了两个主要的 API 子集.
第一个子集提供了访问大硬盘所必须的功能, 包括 检查扩展 In13H
是否存在( 41h ), 扩展读( 42h ), 扩展写( 43h ), 校验扇区( 44h ),
扩展定位( 47h ) 和 取得驱动器参数( 48h ).
第二个子集提供了对软件控制驱动器锁定和弹出的支持, 包括 检查扩展
Int13H 是否存在( 41h ), 锁定/解锁驱动器( 45h ), 弹出驱动器( 46h ),
取得驱动器参数( 48h ), 取得扩展驱动器改变状态( 49h ), int 15h.
如果使用了调用规范中不支持的功能, BIOS 将返回错误码 ah = 01h,
CF = 1.
3. API 详解
1) 检验扩展功能是否存在
入口:
AH = 41h
BX = 55AAh
DL = 驱动器号
返回:
CF = 0
AH = 扩展功能的主版本号
AL = 内部使用
BX = AA55h
CX = API 子集支持位图
CF = 1
AH = 错误码 01h, 无效命令
这个调用检验对特定的驱动器是否存在扩展功能. 如果进位标志置 1
则此驱动器不支持扩展功能. 如果进位标志为 0, 同时 BX = AA55h, 则
存在扩展功能. 此时 CX 的 0 位表示是否支持第一个子集, 1位表示是否
支持第二个子集.
对于 1.x 版的扩展 Int13H 来说, 主版本号 AH = 1. AL 是副版本号,
但这仅限于 BIOS 内部使用, 任何软件不得检查 AL 的值.
2) 扩展读
入口:
AH = 42h
DL = 驱动器号
DS:DI = 磁盘地址数据包(Disk Address Packet)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用将磁盘上的数据读入内存. 如果出现错误, DAP 的 BlockCount
项中则记录了出错前实际读取的数据块个数.
3) 扩展写
入口:
AH = 43h
AL
0 位 = 0 关闭写校验
1 打开写校验
1 - 7 位保留, 置 0
DL = 驱动器号
DS:DI = 磁盘地址数据包(DAP)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用将内存中的数据写入磁盘. 如果打开了写校验选项, 但 BIOS
不支持, 则会返回错误码 AH = 01h, CF = 1. 功能 48h 可以检测BIOS是否
支持写校验.
如果出现错误, DAP 的 BlockCount 项中则记录了出错前实际写入的数
据块个数.
4) 校验扇区
入口:
AH = 44h
DL = 驱动器号
DS:DI = 磁盘地址数据包(Disk Address Packet)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用校验磁盘数据, 但并不将数据读入内存.如果出现错误, DAP 的
BlockCount 项中则记录了出错前实际校验的数据块个数.
5) 锁定/解锁驱动器
入口:
AH = 45h
AL
= 0 锁定驱动器
= 1 驱动器解锁
= 02 返回锁定/解锁状态
= 03h-FFh - 保留
DL = 驱动器号
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用用来缩定指定驱动器中的介质.
所有标号大于等于 0x80 的可移动驱动器必须支持这个功能. 如果
在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用, 将
会成功返回.
驱动器必须支持最大255次锁定, 在所有锁定被解锁之前, 不能在物理上
将驱动器解锁. 解锁一个未锁定的驱动器,将返回错误码 AH= B0h. 如果锁定一
个已锁定了255次的驱动器, 将返回错误码 AH = B4h.
锁定一个没有介质的驱动器是合法的.
6) 弹出可移动驱动器中的介质
入口:
AH = 46h
AL = 0 保留
DL = 驱动器号
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用用来弹出指定的可移动驱动器中的介质.
所有标号大于等于 0x80 的可移动驱动器必须支持这个功能. 如果
在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用, 将
会返回错误码 AH = B2h (介质不可移动). 如果试图弹出一个被锁定的介质
将返回错误码 AH = B1h (介质被锁定).
如果试图弹出一个没有介质的驱动器, 则返回错误码 Ah = 31h (驱动器
中没有介质).
如果试图弹出一个未锁定的可移动驱动器中的介质, Int13h会调用 Int15h
(AH = 52h) 来检查弹出请求能否执行. 如果弹出请求被拒绝则返回错误码(同
Int15h). 如果弹出请求被接受,但出现了其他错误, 则返回错误码 AH = B5h.
7) 扩展定位
入口:
AH = 47h
DL = 驱动器号
DS:DI = 磁盘地址数据包(Disk Address Packet)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用将磁头定位到指定扇区.
8) 取得驱动器参数
入口:
AH = 48h
DL = 驱动器号
DS:DI = 返回数据缓冲区地址
返回:
CF = 0, AH = 0 成功
DS:DI 驱动器参数数据包地址, (参见前面的文章)
CF = 1, AH = 错误码
这个调用返回指定驱动器的参数.
9) 取得扩展驱动器介质更换检测线状态
入口:
AH = 49h
DL = 驱动器号
返回:
CF = 0, AH = 0 介质未更换
CF = 1, AH = 06h 介质可能已更换
这个调用返回指定驱动器的介质更换状态.
这个调用与 Int13h AH = 16h 子功能调用相同, 只是允许任何驱动器
标号. 如果对一台支持可移动介质功能子集的固定驱动器使用此功能,则永远
返回 CF = 0, AH = 0.
简单地将可移动介质锁定再解锁就可以激活检测线, 而无须真正更换介质.
返回:
CF = 0, AH = 0 介质未更换
CF = 1, AH = 06h 介质可能已更换
这个调用返回指定驱动器的介质更换状态.
这个调用与 Int13h AH = 16h 子功能调用相同, 只是允许任何驱动器
标号. 如果对一台支持可移动介质功能子集的固定驱动器使用此功能,则永远
返回 CF = 0, AH = 0.
简单地将可移动介质锁定再解锁就可以激活检测线, 而无须真正更换介质.
10) Int 15h 可移动介质弹出支持
入口:
AH = 52h
DL = 驱动器号
返回:
CF = 0, AH = 0 弹出请求可能可以执行
CF = 1, AH = 错误码 B1h 或 B3h 弹出请求不能执行
这个调用是由 Int13h AH=46h 弹出介质功能调用内部使用的.
回复于:2005-06-17 19:40:45
好长,读了一半,先顶一下
我以前学的时候,我记得我们的老师能把分区表读出来
不知哪位有空说一下
呵呵
让我亲眼看一下
回复于:2005-06-17 19:58:19
引用:原帖由 "风流涕淌" 发表: 不知哪位有空说一下
呵呵
让我亲眼看一下
说什么?
看什么?
上面的东西觉得不够看吗?
回复于:2005-06-17 20:10:01
我的意思是说
上边的东西理论性特别强
我想看看真实的机器里是如何写的
对照着看
我知道要求有点过份
如果没空
我就自已找了
回复于:2005-06-17 20:47:33
引用:原帖由 "风流涕淌" 发表: 我的意思是说
上边的东西理论性特别强
我想看看真实的机器里是如何写的
对照着看
我知道要求有点过份
如果没空
我就自已找了
真实机器的,我马上给你 debug 一份出来。
回复于:2005-06-17 20:59:12
Welcome to FreeDOS
C:\>;debug
=a
1AB7:0100 mov ax, 0201
1AB7:0103 mov bx, 0200
1AB7:0106 mov cx, 0001
1AB7:0109 mov dx, 0080
1AB7:010C int 13
1AB7:010E
=t=100
AX=0201 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=0103 NV UP DI PL NZ NA PO NC
1AB7:0103 BB0002 MOV BX,0200
=t
AX=0201 BX=0200 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=0106 NV UP DI PL NZ NA PO NC
1AB7:0106 B90100 MOV CX,0001
=t
AX=0201 BX=0200 CX=0001 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=0109 NV UP DI PL NZ NA PO NC
1AB7:0109 BA8000 MOV DX,0080
=t
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=010C NV UP DI PL NZ NA PO NC
1AB7:010C CD13 INT 13
=t
AX=0001 BX=0200 CX=0001 DX=0080 SP=FFFE BP=0000 SI=0000 DI=0000
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=0110 NV UP DI PL NZ NA PO NC
1AB7:0110 0000 ADD [BX+SI],AL DS:0200=34
=d 200
1AB7:0200 34 C0 8E C0 8E D8 8E D0-BC 00 7C FC 8B F4 BF 00 4.........|.....
1AB7:0210 06 B9 00 01 F2 A5 EA 67-06 00 00 8B D5 58 A2 4F .......g.....X.O
1AB7:0220 07 3C 35 74 23 B4 10 F6-E4 05 AE 04 8B F0 80 7C .<5t#..........|
1AB7:0230 04 00 74 44 80 7C 04 05-74 3E C6 04 80 E8 DA 00 ..tD.|..t>;......
1AB7:0240 8A 74 01 8B 4C 02 EB 08-E8 CF 00 B9 01 00 32 D1 .t..L.........2.
1AB7:0250 BB 00 7C B8 01 02 CD 13-72 1E 81 BF FE 01 55 AA ..|.....r.....U.
1AB7:0260 75 16 EA 00 7C 00 00 80-FA 81 74 02 B2 80 8B EA u...|.....t.....
1AB7:0270 42 80 F2 B3 88 16 41 07-BF BE 07 B9 04 00 C6 06 B.....A.........
=d
1AB7:0280 34 07 31 32 F6 88 2D 8A-45 04 3C 00 74 23 3C 05 4.12..-.E.<.t#<.
1AB7:0290 74 1F FE C6 BE 31 07 E8-71 00 BE 4F 07 46 46 8B t....1..q..O.FF.
1AB7:02A0 1C 0A FF 74 05 32 7D 04-75 F3 8D B7 7B 07 E8 5A ...t.2}.u...{..Z
1AB7:02B0 00 83 C7 10 FE 06 34 07-E2 CB 80 3E 75 04 02 74 ......4....>;u..t
1AB7:02C0 0B BE 42 07 0A F6 75 0A-CD 18 EB AC BE 31 07 E8 ..B...u......1..
1AB7:02D0 39 00 E8 36 00 32 E4 CD-1A 8B DA 83 C3 60 B4 01 9..6.2.......`..
1AB7:02E0 CD 16 B4 00 75 0B CD 1A-3B D3 72 F2 A0 4F 07 EB ....u...;.r..O..
1AB7:02F0 0A CD 16 8A C4 3C 1C 74-F3 04 F6 3C 31 72 D6 3C .....<.t...<1r.<
=d
1AB7:0300 35 77 D2 50 BE 2F 07 BB-1B 06 53 FC AC 50 24 7F 5w.P./....S..P$.
1AB7:0310 B4 0E CD 10 58 A8 80 74-F2 C3 56 B8 01 03 BB 00 ....X..t..V.....
1AB7:0320 06 B9 01 00 32 F6 CD 13-5E C6 06 4F 07 3F C3 0D ....2...^..O.?..
1AB7:0330 8A 0D 0A 46 35 20 2E 20-2E 20 2E A0 64 69 73 6B ...F5 . . ..disk
1AB7:0340 20 32 0D 0A 0A 44 65 66-61 75 6C 74 3A 20 46 31 2...Default: F1
1AB7:0350 A0 00 01 00 04 00 06 03-07 07 0A 0A 63 0E 64 0E ............c.d.
1AB7:0360 65 14 80 19 81 19 82 19-83 1E 93 24 A5 2B 9F 2F e..........$.+./
1AB7:0370 75 33 52 33 DB 36 40 3B-F2 41 00 44 6F F3 48 70 u3R3.6@;.A.Do.Hp
=d
1AB7:0380 66 F3 4F 73 B2 55 6E 69-F8 4E 6F 76 65 6C EC 4D f.Os.Uni.Novel.M
1AB7:0390 69 6E 69 F8 4C 69 6E 75-F8 41 6D 6F 65 62 E1 46 ini.Linu.Amoeb.F
1AB7:03A0 72 65 65 42 53 C4 42 53-44 E9 50 63 69 F8 43 70 reeBS.BSD.Pci.Cp
1AB7:03B0 ED 56 65 6E 69 F8 44 6F-73 73 65 E3 3F BF 80 01 .Veni.Dosse.?...
1AB7:03C0 01 00 06 0F 3F CA 3F 00-00 00 11 1F 03 00 00 00 ....?.?.........
1AB7:03D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1AB7:03E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1AB7:03F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA ..............U.
=u 200
1AB7:0200 34C0 XOR AL,C0
1AB7:0202 8EC0 MOV ES,AX
1AB7:0204 8ED8 MOV DS,AX
1AB7:0206 8ED0 MOV SS,AX
1AB7:0208 BC007C MOV SP,7C00
1AB7:020B FC CLD
1AB7:020C 8BF4 MOV SI,SP
1AB7:020E BF0006 MOV DI,0600
1AB7:0211 B90001 MOV CX,0100
1AB7:0214 F2A5 REP MOVSW
1AB7:0216 EA67060000 JMP 0000:0667
1AB7:021B 8BD5 MOV DX,BP
1AB7:021D 58 POP AX
1AB7:021E A24F07 MOV [074F],AL
=u
1AB7:0221 3C35 CMP AL,35
1AB7:0223 7423 JZ 0248
1AB7:0225 B410 MOV AH,10
1AB7:0227 F6E4 MUL AH
1AB7:0229 05AE04 ADD AX,04AE
1AB7:022C 8BF0 MOV SI,AX
1AB7:022E 807C0400 CMP BYTE PTR [SI+04],00
1AB7:0232 7444 JZ 0278
1AB7:0234 807C0405 CMP BYTE PTR [SI+04],05
1AB7:0238 743E JZ 0278
1AB7:023A C60480 MOV BYTE PTR [SI],80
1AB7:023D E8DA00 CALL 031A
1AB7:0240 8A7401 MOV DH,[SI+01]
=u
1AB7:0243 8B4C02 MOV CX,[SI+02]
1AB7:0246 EB08 JMP 0250
1AB7:0248 E8CF00 CALL 031A
1AB7:024B B90100 MOV CX,0001
1AB7:024E 32D1 XOR DL,CL
1AB7:0250 BB007C MOV BX,7C00
1AB7:0253 B80102 MOV AX,0201
1AB7:0256 CD13 INT 13
1AB7:0258 721E JB 0278
1AB7:025A 81BFFE0155AA CMP WORD PTR [BX+01FE],AA55
1AB7:0260 7516 JNZ 0278
1AB7:0262 EA007C0000 JMP 0000:7C00
=d 3be, 3ff
1AB7:03B0 - 80 01 ..
1AB7:03C0 01 00 06 0F 3F CA 3F 00-00 00 11 1F 03 00 00 00 ....?.?.........
1AB7:03D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1AB7:03E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
1AB7:03F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA ..............U.
=q
C:\>;
回复于:2005-06-17 20:59:55
这是我的 FreeDOS 系统自带的 MBR 程序。
回复于:2005-06-17 21:05:23
痛哭流涕
回复于:2005-06-17 21:07:53
看到没有?
MBR 末尾明明写着 JMP 0000:7C00
回复于:2005-06-17 21:09:12
最后我给出的是分区表,
我的硬盘只有一个分区。
55AA 实际上就是 AA55,(低位在前),是个分区有效标志。
回复于:2005-06-17 21:40:57
如果对 MBR 感兴趣,如果对 debug 有所了解,不妨看一下这个
http://www.ascc.net/nl/86/1318/05.txt
回复于:2005-06-17 21:43:08
引用:
C:\>;debug
=a
1AB7:0100 mov ax, 0201
1AB7:0103 mov bx, 0200
1AB7:0106 mov cx, 0001
1AB7:0109 mov dx, 0080
1AB7:010C int 13
1AB7:010E
=t=100
AX=0201 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=0103 NV UP DI PL NZ NA PO NC
1AB7:0103 BB0002 MOV BX,0200
=t
AX=0201 BX=0200 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=0106 NV UP DI PL NZ NA PO NC
1AB7:0106 B90100 MOV CX,0001
=t
AX=0201 BX=0200 CX=0001 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=0109 NV UP DI PL NZ NA PO NC
1AB7:0109 BA8000 MOV DX,0080
=t
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=010C NV UP DI PL NZ NA PO NC
1AB7:010C CD13 INT 13
=t
AX=0001 BX=0200 CX=0001 DX=0080 SP=FFFE BP=0000 SI=0000 DI=0000
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=0110 NV UP DI PL NZ NA PO NC
1AB7:0110 0000 ADD [BX+SI],AL DS:0200=34
=d 200
flw 兄,你这个调试方法是不对的,应该用 p ,而不是用 t
t 会进入到中断里面,而 p 则是执行完这个中断后返回
因此你 t 之后 d200,是无法正确显示硬盘 0 道 0 面 1 扇区数据的,应该用 p 代替就对了 :D
回复于:2005-06-18 11:20:35
引用:原帖由 "platinum" 发表: flw 兄,你这个调试方法是不对的,应该用 p ,而不是用 t
t 会进入到中断里面,而 p 则是执行完这个中断后返回
因此你 t 之后 d200,是无法正确显示硬盘 0 道 0 面 1 扇区数据的,应该用 p 代替就对了 :D
是吗? :?: :?: :?:
奇怪了,可是我怎么能看到扇区内容呢?
我再看看帮助。
回复于:2005-06-18 11:23:01
引用:原帖由 "flw" 发表: 是吗? :?: :?: :?:
奇怪了,可是我怎么能看到扇区内容呢?
我再看看帮助。
我刚才又试了一下,t 和 p 一样啊。
是不是 FreeDOS 的 debug 和 MS 的不一样啊。
我再找找资料。
回复于:2005-06-18 15:02:06
引用:
=t
AX=0201 BX=0200 CX=0001 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=0109 NV UP DI PL NZ NA PO NC
1AB7:0109 BA8000 MOV DX,0080
=t
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=010C NV UP DI PL NZ NA PO NC
1AB7:010C CD13 INT 13
=t
AX=0001 BX=0200 CX=0001 DX=0080 SP=FFFE BP=0000 SI=0000 DI=0000
DS=1AB7 ES=1AB7 SS=1AB7 CS=1AB7 IP=0110 NV UP DI PL NZ NA PO NC
1AB7:0110 0000 ADD [BX+SI],AL DS:0200=34
恩,看来是不一样
从连续几次 t 后看,段地址没有变,而偏移地址向后移动了,证明确实执行了 INT 13H 后跳了出来,看来和传统 MS 的 debug 确实不大一样
FreeDOS 是什么?我没接触过,介绍一下 :em06:
回复于:2005-06-18 20:22:24
引用:原帖由 "platinum"]FreeDOS 是什么?我没接触过,介绍一下 :em06: 发表:
FreeDOS 是硕果仅存的 DOS。
现在功能很强,支持 FAT32 NTFS 什么的。
而且移植了很多 GNU 的工具,大有卷土重来之势。
回复于:2005-06-20 14:39:31
还是不明白,希望大大们解答:boot loader record和boot loader是一回事吗,如果不是一回事,那么boot loader record写在mbr里那boot loader写在哪儿,系统启动时是怎样一个步骤?
回复于:2005-06-20 14:53:02
我不明白 boot loader record 是什么意思
如果和 MBR (Master Boot Record) 一样去理解,那么 BLR (Boot Loader Record) 可能应该存放在逻辑分区的第一扇区上
我认为 boot loader 其实就是一段引导程序,不知道 grub 算不算
这里,我也想知道 boot loader 和 boot loader record 的区别是什么。。。。
回复于:2005-06-20 15:00:16
boot loader record是啥玩意?哪儿看到的概念? :roll:
回复于:2005-06-20 15:39:26
引用:原帖由 "面筋粘知了"]系统启动时是怎样一个步骤? 发表:
1,按电源,系统加电,CPU 寄存器复位,IP 指向 ROM,然后 CPU 开始工作。(如何“开始”我还不知道,不过猜想应该有个激活电路)。
2,ROM 中的程序就是事先写好的 BIOS 自检程序,存储在 CMOS 介质(CMOS [计] 互补金属-氧化物-半导体)上,BIOS 自检程序我同样也不了解。自检完毕后,BIOS 将根据用户的启动顺序设置寻找启动设备,PXE、光盘、USB 等等我不太懂,软盘和硬盘是类似的(硬盘稍复杂些),下面以硬盘为例。
3,BIOS 检测并读取启动硬盘的物理 0 面 0 道 1 扇区(MBR),共 512 个字节到内存 0x07C0:0000,然后判断 511、512 两个字节是不是 55AA,如果是,则认为此硬盘可引导,那么执行 JUMP 0x07C0:0000 将控制权交给 MBR。
4,至此,系统控制权由 MBR 接管,因为 MBR 是个程序,你自己就可以写一段,因此你完全可以做你想做的任何事情。比如格式化硬盘 :D :D :D,DOS 时代的引导记录型病毒就是这么回事。再或者像 Linus 一样,做一个在屏幕上循环显示 A 和 B 的程序,都可以。
5,尽管如此,MBR 还是有一定规范的,我也不知道这个规范是谁定的,反正习惯上开始,从偏移量 1BE 开始的 64 个字节,称为“分区表”,共四条记录,每条记录 16 个字节。
6,因为按照规范(就是我不知道的那个规范),硬盘上可以装多个操作系统,所以 MBR 只起到一个选择启动哪个操作系统的作用,真实的操作系统加载流程由 存放在引导扇区 BOOT SECTOR 中的引导记录 BOOT RECORD 来完成,同样按照规范,BOOT RECORD 应该从 0x07C0:0000 处开始执行,所以 MBR 通常都要先将自己搬移,以腾出位置去加载 BOOT SECTOR。
7,最简单的指明到底需要引导哪个操作系统的方法是设置“活动分区”,在分区表的四个记录中,一般来说有且只有一个记录的标记是活动的,MBR 找到这个分区记录后,根据记录的起始扇区加载该分区的逻辑 0 扇区(起始扇区)的内容到 0x07C0:0000,并且执行 JUMP 0x07C0:0000。控制权切换到 BOOT RECORD。
8,BOOT RECORD 的工作原理类似于 MBR,以 linux 为例,它会读取 linux 内核镜像到地址 0x9000:0000,然后开始切换到 0x9000:0000 继续运行。
以 MS-DOS 为例,它会读取文件系统根目录下的 IO.SYS 和 MSDOS.SYS 两个文件然后加载到内存中继续运行。
总之,所有的一切从 MBR 开始都是程序,你想怎么写就怎么写,懂汇编的朋友们 debug/dd 出来看看就明白了。
回复于:2005-06-20 15:48:43
在安装Redhat Linux过程中会有一选项让你选择把boot loader record安装在mbr或者boot分区的first sector,我的理解是boot loader是一个程序(像grub、lilo),boot loader record是指向boot loader的记录,实际是如何,请指正!
回复于:2005-06-20 15:48:43
很详细
补充说明一下
0x07C0:0000
0000:0x7C00
这两个地址是一样的,都是物理地址 0x7c00
回复于:2005-06-20 15:53:25
引用:原帖由 "platinum" 发表: 很详细
补充说明一下
0x07C0:0000
0000:0x7C00
这两个地址是一样的,都是物理地址 0x7c00
0x07C0:0000
0x0000:7C00
:D :D :D
已经改正啦。
回复于:2005-06-20 15:58:36
引用:原帖由 "flw" 发表: 金属-氧化物-半导体)上,BIOS 自检程序我同样也不了解。自检完毕后,BIOS 将根据用户的启动顺序设置寻找启动设备,PXE、光盘、USB 等等我不太懂,软盘和硬盘是类似的(硬盘稍复杂些),下面以硬盘为例。
3,BIOS..........
是很详细,但是如果我选择把boot loader record安装在boot分区的first sector,那又是怎样的一个引导过程?
回复于:2005-06-20 16:01:42
能否先告诉我什么是 boot loader record ?
回复于:2005-06-20 16:18:05
下面再说一下 linux 的启动过程。
1,前面说到,MBR 会加载 OS LOADER 到 0x07C0:0000 然后开始运行,
linux 的 OS LOADER 代码名字叫 bootsect.s,是一个长度为 512 字节的小程序。前面也提到,多个操作系统的切换通过激活不同的分区表记录来完成,DOS/LINUX 都有个 fdisk 程序用来做这件事,windows 的磁盘管理器可以完成类似功能,但是活动分区每次设置完之后得重启才能生效,因此多个操作系统之间的选择似乎不是那么方便,因此就有了多操作系统引导程序,如 grub lilo 等等。这些程序在 MBR 的眼中看来,就是引导记录,你甚至可以将它们直接写到 MBR 中,覆盖掉原有的 MBR 程序,但是我建议不要这么做,因为 MBR 只有一个,多个操作系统之间争夺起来会比较讨厌,经常会发生你刚写了我又写一遍的情形,因此建议统统装到 BOOT SECTOR,并且在硬盘分区表中将含有最强功能 OS LOADER 的那个分区激活。这样 MBR 会将控制权交给 OS LOADER。
2,OS LOADER 接受用户的选择,然后启动需要启动的操作系统。linux 系统则开始运行 bootsect.s,
3,bootsect.s 什么都不做,因为它只是一个 OS LOADER,它首先将自己移动到 0x9000:0000 处,然后将另一个组件 setup.s 加载到 0x9000:0200,然后 JMP 0x9000:0200 开始运行 setup.s
4,setup.s 加载操作系统的头部 head.s 及紧随其后的 linux 内核 main.c 移动到 0x1000:0000,然后调用 BIOS 功能获取并保存一大堆系统参数,如磁盘参数表等等,准备接下来准备覆盖掉 BIOS 向量表,覆盖后所有的 BIOS 中断都不再可用。
5,设置完毕之后,setup.s 将以 head.s 为首的 Linux 内核镜像移动到物理地址 0x0000:0000,然后设置段表、页表,最后调整机器状态字到 32 位保护模式。
6,JMP 0x0 跳转到线性地址 0x0,开始执行 head.s。
head.s 设定一些参数之后,调用 C 语言程序入口 main() 函数,操作系统进入 C 程序控制。
特别说明:
以上内容全凭记忆,因为本人记性一向不好,如有记错,请 BS 一下下就可以了,不要吐口水。
刚又查了一下书,这下应该对了。
回复于:2005-06-20 16:30:23
刚才又修改了几个用得不正确的术语。下面我再统一解释一下:
MBR(Master Boot Record)硬盘主引导记录,存储在 0 面 0 道 1 扇区,
这个位置不能变,因此一个硬盘的 0 磁道要是坏了,那么它就该扔了。
BOOT SECTOR 引导扇区,指可引导分区的逻辑 0 扇区,也即起始扇区。
何谓可引导分区?即起始扇区末尾两字节分别为 0x55 0xAA 的分区。
BOOT RECORD 引导记录,引导扇区中存贮的程序。
OS LOADER 操作系统加载程序,用来将一个操作系统的内核从磁盘调入内存并设置参数以便于运行该内核的一段程序,BOOT RECORD 通常就是一个 OS LOADER 程序,但是对于 grub lilo 等 OS LOADER 来讲,它本身就是一个完整的软件,它会接受用户的选择并加载运行相应的 BOOT RECORD。
boot loader record 没听说过。
回复于:2005-06-20 16:30:29
引用:
5,设置完毕之后,setup.s 将 head.s 及紧随其后的 linux 内核 main.c 移动到 0x0000:0000,然后设置段表、页表,最后调整机器状态字到 32 位保护模式。
我对这个有些异议
在进入 32 位保护模式前,物理地址 0x00000 开头的 400h 字节应该是存放 256 个中断的“中断向量表”,怎么能把程序复制过去呢?
回复于:2005-06-20 16:32:59
引用:原帖由 "platinum" 发表: 我对这个有些异议
在进入 32 位保护模式前,物理地址 0x00000 开头的 400h 字节应该是存放 256 个中断的“中断向量表”,怎么能把程序复制过去呢?
这段区域最终是要被覆盖的。
不过在覆盖之前,操作系统会先在物理地址 0x1000:0000 处呆一会儿。调用完中断之后,再下调到 0x0 覆盖 BIOS 中断向量。
回复于:2005-06-20 16:35:21
在进入 32 位保护模式之前,中断向量表可以被破坏吗?
如果是纯内存操作我认为还可以,如果涉及到调用中断。。。。
不知道我是不是记错了,线性地址好像也是 32 保护模式下的叫法
回复于:2005-06-20 16:47:31
引用:原帖由 "platinum" 发表: 在进入 32 位保护模式之前,中断向量表可以被破坏吗?
如果是纯内存操作我认为还可以,如果涉及到调用中断。。。。
不知道我是不是记错了,线性地址好像也是 32 保护模式下的叫法
刚改了下,你再看看。
回复于:2005-06-20 16:51:51
恩? flw 兄指点一下改了哪里,我没找到 :oops:
回复于:2005-06-20 16:53:05
引用:原帖由 "platinum"]能否先告诉我什么是 boot loader record ? 发表:
如图
|