boot文件夹下三个文件
bootsect.s setup.s head.s
0xFFFF0 (一开机指令运行的地址)
0x7c00 (bootsect.s的二进制文件)
0x90000 (bootsect.s把自己移动到这个位置)
0x90200 (setup.s的二进制代码的位置)
0x10000 (system模块的位置system模块中包含head.s的二进制)
0x80000
本章主要描述boot/目录中的三个汇编代码文件,见列表2.1 所示。正如在前一章中提到的,这三个
件虽然都是汇编程序,但却使用了两种语法格式。Bootsect.s 和setup.s 采用近似于Intel 的汇编语言
法,需要使用Intel 8086 汇编编译器和连接器as86 和ld86,而head.s 则使用GNU 的汇编程序格式,
要用GNU 的as 进行编译。这是一种AT&T 语法的汇编语言程序。
列表2.1 linux/boot/目录
文件名 长度(字节) 最后修改时间(GMT) 说明
bootsect.s 5052 bytes 1991-12-05 22:47:58
head.s 5938 bytes 1991-11-18 15:05:09
setup.s 5364 bytes 1991-12-05 22:48:10
bootsect.s 代码是磁盘引导块程序,驻留在磁盘的第一个扇区中(引导扇区,0 磁道(柱面),0 磁头,
第1 个扇区)。在PC 机加电ROM BIOS 自检后,引导扇区由BIOS 加载到内存0x7C00 处,然后将自己移动
到内存0x90000 处。该程序的主要作用是首先将setup 模块(由setup.s 编译成)从磁盘加载到内存紧接
着bootsect 的后面位置(0x90200),然后利用BIOS 中断0x13 取磁盘参数表中当前启动引导盘的参数,
接着在屏幕上显示“Loading system...”字符串。再者将system 模块从磁盘上加载到内存0x10000 开始
的地方。随后确定根文件系统的设备号,若没有指定,则根据所保存的引导盘的每磁道扇区数判别出盘的
类型和种类(是1.44M A 盘?)并保存其设备号于root_dev(引导块的0x508 地址处),最后长跳转到setup
程序的开始处(0x90200)执行setup 程序。
查了汇编书BIOS0X13中断.
AH 功能 调用参数 返回参数
0 磁盘复位 DL=驱动器号 失败 : AH=错误码
(00,01为软盘,80h,81h...为硬盘
1 读磁盘驱动器 AH=状态字节
状态
2 读磁盘扇区 AL=扇区数 读成功:
(CL)6,7 (CH)0~7=磁道号 AH=0
(CL)0~5=扇区数 AL=读取的扇区数
DH/DL=磁头号/驱动器号 读失败:
ES:BX=数据缓冲区地址 AH=错误码
3 写磁盘扇区 同上 写成功:
AH=0
AL=写入的扇区数
写失败:
AH=错误码
4. 检验磁盘扇区 AL=扇区数 成功:
(CL)6,7 (CH)0~7=磁道号 AH=0
(CL)0~5=扇区数 AL=检验的的扇区数
DH/DL=磁头号/驱动器号 失败: AH=错误码
5 格式化盘磁盘 AL=扇区数 成功:
(CL)6,7 (CH)0~7=磁道号 AH=0
(CL)0~5=扇区数
DH/DL=磁头号/驱动器号 失败:
ES:BX=格式化参数表指针 AH=错误码
发觉错误码都放在AH中.
学习过程中一定要有耐心,不能为了追究进度,一知半解.