《30天自制操作系统》学习笔记(二)

一、制作真正地IPL(IPL, initial program loader,启动程序装载器)
(PS:这部分其实就是就是实现了一个用途,即将扇区中的内容读取到内存中)
    (一)储备知识
        1.软盘结构及读写
            a.磁头(head)。读取软盘数据,有正面反面个一个,分别编号为0和1,所以软盘的正反两面都可以存储数据。
            b.柱面(cylinder)。就是软盘上的一圈圈同心圆(上图中所示的磁道),一张软盘有80个柱面。
            c.扇区(sector)。将每一个柱面分为若干个区域以提高读写效率,这样的区域就是扇区,每个柱面有18个扇区,每个扇区能够存储512个字节的数据。
            所以一张磁盘可以存储的总数据=每个扇区可存储的字节数*每个柱面的扇区数*柱面数*磁头数=512*18*80*2=1474560B=1440KB
        2.BIOS调用
              INT 0x13(从软盘读取数据并写入到磁盘中)
            所需参数:
            AH用于表示操作类别,AH=0x02表示读数据,AH=0x03表示写数据,AH=0x04表示校验,AH=0x0c表示寻道
            AL存储处理对象的扇区数(只能同时处理连续的扇区)
            CH=柱面号
            CL=扇区号(原书中CL=扇区号(0-5位,因为总共只有18个扇区变化)|(柱面号&0x300)>>2)
            DH=磁头号
            DL=驱动器号
            ES:BX=缓冲地址(校验及寻道时不使用)
            返回值:
            FLACS.CF==0:没有错误,AH==0
            FLACS.CF==1:有错误,错误号码存入AH内
        2.软盘存储方式
            a.文件名会写在0x002600以后的地方
            b.文件的内容会写在0x004200以后的地方

二、代码解读
    (一)连续读取多个扇区(以18个扇区为例,同时读每个扇区时的试错次数为5次)
               (ps:因为一个柱面有18个扇区,所以此程序也可以用来读取一个完整的柱面)
                                                初始化
                                 MOV AX,0X0820    mov es,ax    设置缓冲区段地址    
                                 mov ch,0    mov dh,0    mov cl,2    设置INT 0x13所需参数 柱面号=0,磁头号=0,扇区号=2
                                                    |
                |—————————  | —————————————————————————————— SI=SI+1
                |                                   |                           读取扇区失败,重试                                          AH=0x00,dl=0x00
                |                               读扇区                                                                                                                    |
                |                mov ah,0x02    mov al=1    设置INT 0X13所需参数,表示读扇区,1次操作1个扇区----------|
                |                mov bx,0    mov dl,0x00    设置内存地址和驱动器号
                |                                    |
                |否                                 |读取成功
                |                                    |
                |                              设置参数
                |               mov ax,es    add ax,0x0020    mov es,ax    将内存地址后移0x200,因为一个扇区512字节
                |               add cl,1    扇区号加1
                |               cmp cl,18    判断是否已经读取了18个扇区
                |                                    |
                ------------------------  |是
                                                     |   
                                                  结束 

    (二)读取多个柱面(在(一)的基础上读取10个柱面)
            原理与编程思想与上述流程相同,但需要注意以下几点:
            1.磁盘的读写顺序为扇区-->磁头-->柱面。及在读写是先读取扇区信息,若读完了18个扇区(代码柱面的一边已经读完,则调整磁头号,读写扇区反面的扇区数据,当另一名也读完之后,则调整柱面号,读取下一个柱面)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值