一、分阶段启动原因
软盘上没有文件系统时,所有编译链接后的二进制文件按顺序直接写入软盘扇区,BIOS将boot加载到0x7c00处后开始执行boot代码,由boot代码加载剩余的系统代码到内存。
boot只有512字节,无法将整个系统内核加载到内存,怎么办?
可以再写点代码专门用于加载系统内核数据到内存,这个代码不会过大导致boot不能将其加载进入内存,这个代码的名字就叫做loader吧,既然loader、系统内核是以文件的方式保存在了软盘FAT12文件系统上,那么boot就需要从FAT12中找到loader文件。
loader执行过程中再进一步找到内核文件,将其加载到内存中执行。
二、从磁盘启动操作系统需要解决的问题
如何在bootloader中实现从磁盘扇区中读取指令或数据?
(一)首先要了解磁盘访问方式。
1. 磁盘物理结构
存储数据原理:盘片上充满磁化的基本单元,由NS极来表示01。
物理结构:
一个盘片,两面都可以存数据。一个磁盘可以有多个盘片。
一个盘片两面都有磁头,磁头左右摆动,多个磁头摆动是同步的,寻找到指定磁道后停止。
磁道:一圈同心圆。
扇区:将一个磁道划分成一个个扇区。每个扇区数据大小一样,常是512字节。
每片上的同直径的同心圆磁道组成柱面,一个柱面上的磁道编号相同。
补充:每个扇区数据量一样,但不同磁道的扇区面积不一样,所以数据密度也不一样。
磁盘寻址的基本单位是512字节,每个扇区512字节。磁盘必须被划分成块结构,Linux的文件除了字符类型还有块设备类型。磁盘就是最典型的块设备文件。
2.CHS定位法
多个磁头同步摆动,确认磁道(柱面)后停止,然后确认磁头(也就相当于盘面),盘面旋转,确认是当前磁道的哪个扇区。
柱面cylinder,磁头head,扇区sector。该定位法简称CHS定位法。
3.磁盘的逻辑结构
将磁盘上同心圆拉直,连在一起,抽象为线性结构。
以两个盘片,4个盘面为例
把磁盘逻辑抽象成一个数组sector arr[n],每个元素为扇区,元素大小512字节。
4. LBA
根据逻辑结构,对磁盘管理就变成了对数组进行管理。数组下标作为扇区编码,磁盘上的每个扇区都有唯一编码。在操作系统内部,称这种地址为LBA地址(逻辑块地址)。
在物理结构上,用CHS定位扇区,在逻辑结构上,用LBA地址定位。
5. LBA转换CHS
磁盘4面,每面10个磁道,每个磁道100个扇区。每个扇区512字节。总容量:4*10*100*512字节。下标范围:4*10*100。
123号扇区,物理磁盘的位置?
H:123/(10*100)=0
C:[123%(10*100)]/100=1
S:123%100=23
;
; Converts an LBA address to a CHS address
; Parameters:
; - ax: LBA address
; Returns:
; - cx [bits 0-5]: sector number
; - cx [bits 6-15]: cylinder
; - dh: head
;
lba_to_chs:
push ax
push dx
xor dx, dx ; dx = 0
div word [bdb_sectors_per_track] ; ax = LBA / SectorsPerTrack
; dx = LBA % SectorsPerTrack
inc dx ; dx = (LBA % SectorsPerTrack + 1) = sector
mov cx, dx ; cx = sector
xor dx, dx ; dx = 0
div word [bdb_heads] ; ax = (LBA / SectorsPerTrack) / Heads = cylinder
; dx = (LBA / SectorsPerTrack) % Heads = head
mov dh, dl ; dh = head
mov ch, al ; ch = cylinder (lower 8 bits)
shl ah, 6
or cl, ah ; put upper 2 bits of cylinder in CL
pop ax
mov dl, al ; restore DL
pop ax
ret
注: