学习网考试学习资料

Gzu521.com

Linux学习笔记(1)

LINUX教程   点击:次   发布时间:2006-12-19   【字体: 】   来源:blog
Gzu521.com我的学习网

os 启动第一步
1. bios
cpu 的初始化
? 主机加电后,启动时钟发生器,在总线上产生powergood信号
? cpu收到reset信号,进入初始化过程
cpu转入8086实模式
ds = es = fs = gs = ss = 0
cs = 0xffff
ip = 0xfff0
进入bios加电自检过程(power on self test)
bios初始化
关中断,进行所有的post检测
将中断向量表的起始地址设为0x0000h
0x0000h~0x03ffh中存放了256个中断
建立了实模式下的中断向量表
bios的启动程序调用int 19h中断
将控制权转移给boot loader
? int 19h中断的功能
 int? 19h按照bios中的启动设备顺序查询每个启动设备
 在软盘的启动扇区或者硬盘的mbr中有boot? loader,那么这个扇区的最后两个字节必然为0xaa55。bios将这个扇区(512个字节)读入内存的0000:7c00开始的位置,然后跳转到内存0000:7c00的地方开始执行
? 如果在所有的启动设备上都找不到boot loader,那么就调用int 18h,将控制权交给bios rom basic,锁定机器,并且在屏幕上显示no boot device ***ailable
? 结论
 boot? loader应当存放在启动设备的第一个扇区中,对于硬盘是mbr,对于软盘是启动扇区
 安装了boot? loader的启动扇区的最后两个字节必须为0xaa55
 bios在post过程结束以后,调用int 19h中断,将boot? loader读入内存0000:7c00处。然后释放控制权,跳转到0000:7c00开始执行boot loader的代码
2. 最简单的boot loader:fdisk /mbr
硬盘的分区表结构
a) 第一个扇区为mbr
b) 一个硬盘上最多有4个主分区
c) 第一个主分区一般从cylinder 0, head 1, sector 1开始
d) cylinder 0, head 0, sector 2~n一般来说保留不用
e) 其余的主分区一般从cylinder x, head 0, sector 1开始

master boot record
f) 位于硬盘的cylinder 0, head 0, sector 1的位置
g) 大小为512字节
h) 其中存放了4个主分区的入口,每个入口占16个字节(这就是为什么一个磁盘最多只能有4个主分区的原因)
i) 最后两位为启动标志,如果mbr中有boot loader的话,则为0xaa55
j) 留给boot loader的空间为512-16x4-2=446字节
mbr中的boot loader的功能
k) 初始化,将自身搬移到0000:0600的位置
l) 在主分区入口表中寻找活动的分区
m) 调用int 13h ah=02将活动的分区的启动扇区读入内存0000:7c00处
n) 跳转到0000:7c00处执行活动分区的启动扇区中的代码
初始化,将自身搬移到0000:0600的位置 :=-,}J=wAcl~XN9 [ 本 资 料 来 源 于 贵 州 学 习 网 电脑课堂LINUX教程 http://Www.gzU521.com ] :=-,}J=wAcl~XN9

0000:7c00 cli 关中断
0000:7c01 xor ax,ax
0000:7c03 mov ss,ax 将堆栈段(ss)设为0
0000:7c05 mov sp,7c00 将栈顶指针(sp)设置为7c00
0000:7c08 mov si,sp 将si也设为7c00
0000:7c0a push ax
0000:7c0b pop es 将es设为0000
0000:7c0c push ax
0000:7c0d pop ds 将ds设为0000
0000:7c0e sti 开中断
0000:7c0f cld
0000:7c10 mov di,0600 将di设为0600
0000:7c13 mov cx,0100 准备移动256个字(512字节)
0000:7c16 repnz
0000:7c17 movsw 将mbr从0000:7c00移动到0000:0600
0000:7c18 jmp 0000:061d 开始搜索主分区入口表
? 在主分区入口表中寻找活动的分区

0000:061d mov si,07be si指向分区表入口(在总共512byte的主引导记录中,mbr的引导程序占了其中的前446个字节(偏移0h~偏移1bdh),随后的64个字节(偏移1beh~偏移1fdh)为dpt(disk partitiontable,硬盘分区表),最后的两个字节“55 aa”(偏移1feh~偏移1ffh)是分区有效结束标志)
0000:0620 mov bl,04 一共有4个表项
0000:0622 cmp byte ptr [si],80 是否为活动分区
0000:0625 jz found_active 找到了一个活动表项
0000:0627 cmp byte ptr [si],00 是否为非活动分区
0000:062a jnz not_active 不可识别的分区标识
0000:062c add si,+10 指向下一个表项(+16)
0000:062f dec bl 循环标志减一
0000:0631 jnz 0000:061d 继续循环
0000:0633 int 18 未找到可启动的分区,转到rom basic

对于磁盘结构可以详看 http://www.datasoon.com/fat32-1.htm


? 调用int13 ah = 02h读取启动扇区

0000:0635 mov dx,[si] 设置int 13调用中head和driver的值
0000:0637 mov cx,[si+02] 设置int 13调用中cylinder的值
0000:063a mov bp,si 保存活动分区入口表项地址

0000:065d mov di,0005 设置读取的重试次数
0000:0660 mov bx,7c00 将启动扇区读取到0000:7c00(es:bx)
0000:0663 mov ax,0201 准备调用int 13读取一个扇区al = 01
0000:0666 push di 保存重试次数di
0000:0667 int 13 调用int 13读取一个扇区到0000:7c00
0000:0669 pop di 恢复重试次数di
0000:066a jnb int13ok 如果读取成功,则跳转至启动代码
0000:066c xor ax,ax 准备int 13 ah = 0复位磁盘
0000:066e int 13 调用int 13复位磁盘
0000:0670 dec di 重试次数减一
0000:0671 jnz 0000:0660 进行下一次重试

? 运行启动扇区中的代码

0000:067b mov di,7dfe 指向启动扇区中的启动标识
0000:067e cmp word ptr [di],aa55 检查启动表识是否为0xaa55
0000:0682 jnz display_msg 如果不是,则保错
0000:0684 mov si,bp 恢复si,指向活动分区入口表项
0000:0686 jmp 0000:7c00 跳转至启动扇区的代码

? 结论
 boot loader放在可启动设备的第一个扇区中?
 boot? loader的大小受扇区大小和其他附加信息的限制。在mbr中,为446字节
 boot? loader在从bios中接手cpu的控制权时,位于内存地址0000:7c00处
 fdisk /mbr产生的boot? loader不具备启动os的能力,其本质上是一个chain loader,用于引导一个有启动os能力的boot loader
3.如何引导os:dos boot loader
? boot sector的结构
 boot sector位于每个分区的第一个扇区?
 boot? sector的第一个部分是一个跳转指令和一个nop,以跳转实际的boot loader的代码中
 bios parameter? block中存放了和这个分区相关的一系列参数
 bpb之后就是实际的boot loader的代码?
? 最后是一个可启动分区标识0xaa55
? 使用format /s对boot sector做的修改
 在0x000h处写入bpb?
? 在0x03eh处写入dos boot loader的代码
 在0x1feh处写入0xaa55标识?
? 此外,format /s还要
? 初始化fat表
 将io.sys和msdos.sys写入,占据fat表前两个表项?
? dos boot loader的功能
? 初始化
 计算根目录所在的fat表的扇区号?
 读取根目录的第一个扇区到0000:0500?
? 检查前两个表项是否为io.sys和msdos.sys
 将io.sys的前3个扇区读入0000:0700或者0070:0000的位置中?
? 在寄存器中保留一些信息,然后跳转到0070:0000处执行操作系统代码
 dos boot loader和mbr中的boot? loader的最大区别在于对于文件系统的理解
? mbr中的boot loader不理解文件系统,所以无法启动特定的os
? dos boot loader提供了对于fat文件系统的支持,所以能够启动在fat文件系统上的dos
? dos boot loader知道os的内核文件的位置,其主要的工作就是将内核文件读入内存,然后将控制权转交给os
4.硬盘寻址方式:chs vs lba
? 最早期的chs寻址
 最早期的磁盘寻址是通过cylinder/head/sector进行的,int? 13h中给出的chs参数直接指定了数据的物理位置
 例:int 13h ah = 02?
? ah = 02 al = 读入的扇区数目
? ch = cylinder低8位 cl = cylinder高两位
? dh = head dl = 操作的磁盘(80h for c:)
? 限制:
? cylinder <= 1024
? head <= 16
? sector <= 63
? 总容量 < 1024 x 16 x 63 x 512b = 528mb
? l-chs & p-chs
? 为了解决直接寻址的问题,现代的hd中,chs只有逻辑上的意义,不表达物理上的实际位置
 l-chs用在支持chs? translation的bois的int 13 ah = 0xh的调用中
? cylinder <= 1024
? head <= 256
? sector <= 63
? 总容量 <= 1024 x 256 x 63 x 512b = 8gb
? p-chs用在hd的接口上
? cylinder <= 65535
? head <= 16
? sector <= 63
? 总容量 <= 65535 x 16 x 63 x 512b = 136gb
? lba:large block addressing
? lba的出现是为了解决chs模式地址受限的问题
? lba提供了一种线性的寻址方式:cylinder 0,head 0,sector 1相当于lba地址0。往后每增加一个扇区,lba地址加一
? lba地址和chs地址可以通过如下公式转换
? lba = ( (cylinder * heads_per_cylinder + heads ) * sectors_per_track ) + sector - 1
? 新型的bois提供了int 13h ah = 4xh的扩展磁盘调用以支持lba模式
? lba:large block addressing
 int 13h ah = 42h?
? ah = 42h dl = 操作的磁盘(80h for c:)
? ds:si = disk address packet
 disk address packet的格式?


? 结论:寻址方式和boot loader的关系
 bios在post过程以后调用int 19h,使用的是chs寻址?
 如果一个os自身的boot? loader使用的是chs寻址模式,那么在老式bios上不能启动528mb以后的分区,在新式bios上不能启动8g以后的分区(lilo的问题)
? 只有支持lba的boot loader才能支持启动8g以后分区上的os
4.支持多os引导的boot loader
? 支持多os引导的boot loader是:
 一段在启动时被bios int 19调用的代码?
 能够理解系统中安装的多个不同的os?
? 用户可以选择启动特定的os
 程序根据用户选择,通过直接载入或者chain load的方法,启动选中的os?
? 支持多os引导的boot loader需要:
 自身足够的小,或者支持多阶段载入,以能够安装在mbr或者boot sector中?
? 能够理解多种文件系统的格式,以便能够找到存放在不同文件系统下的系统内核
? 能够理解多种文件格式(elf/a.out),以便能够正确的载入不同的系统内核
? 支持chs和lba两种磁盘访问模式,以便能够正确的启动8g以后的分区
 支持chain loader,以便通过特定的boot? loader载入os
? 支持多os引导的boot loader在执行32位os的内核代码前,需要构建的机器状态:
? cs必须是一个32位的可读可执行的代码段,偏移为0,上限为0xffffffff
 ds, es, fs,? gs和ss必须为32位的可读写段,偏移为0,上限为0xffffffff
 2?0号地址线必须在32位地址空间中可用(初始固定为0)
? 分页机制必须被关闭
 处理器中断标记被关闭?
 eax的值为0x2badb002?
 ebx中存放了一个32位的地址,指向由boot? loader填充的一系列启动信息
引自:multiboot specification

下 一 页
10页: 第 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]

责任编辑:gzu521

电脑课堂分类
Windows 2000教程
Windows XP教程
Windows 2003教程
Windows Vista教程
LINUX教程
软件教学
办公软件
硬件DIY
分类推荐信息
更多...
大类最新文章
更多...