操作系统学习与实践2: 分两个阶段启动OS(bootloader+kernel)

本文详细介绍了操作系统启动过程中的分阶段启动原因,包括bootloader和kernel的加载。解释了磁盘的物理和逻辑结构,CHS与LBA地址,以及FAT12文件系统。此外,讨论了二阶段启动的具体步骤,如何创建软盘FAT12文件系统,以及在实践中使用bochs进行调试的方法。
摘要由CSDN通过智能技术生成

一、分阶段启动原因

        软盘上没有文件系统时,所有编译链接后的二进制文件按顺序直接写入软盘扇区,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

注:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值