Linux(ubuntu)下30天自制os学习引导,第3.0天(读取u盘第二扇区到内存)

第三天是关于读取u盘中扇区,比较关键的一部分,所以博主將分成三部分来介绍关于如何读取u盘的扇区。学会了如何读取u盘的扇区后,就为后面从u盘扇区复制内核程序到内存打下了基础。

本部分將介绍如何读取u盘的第二扇区,代码说明一切,先上代码,然后对关键性的步骤进行解释。

.global start
.code16
start:

    jmp entry
    /*定义fat12文件格式*/
    .byte 0x00
    .ascii "helloOSX"
    .word  512
    .byte  1
    .word  1
    .byte  2
    .word  224
    .word  2880
    .byte  0xf0
    .word  9
    .word  18
    .word  2
    .long  0
    .long  2880
    .byte  0,0,0x29
    .long  0xffffffff
    .ascii  "myosudisk  "
    .ascii  "fat12   "
    .fill 18


entry:
    mov $0,%ax
    mov %ax,%ds
    mov %ax,%es
    mov %ax,%ss
    mov $0x7c00,%sp
    mov %dl,(0x7dfe)

    mov $msg,%si
    call puts
    mov $my,%si
    call puts

/*memory=0x8200,chs=002*/
    mov $0x820,%ax
    mov %ax,%es
    mov $0x00,%bx
    mov $0x00,%ch
    mov $0x00,%dh
    mov $0x02,%cl
    call read
    mov $okmsg,%si
    call puts

loop:
    jmp loop




read:
    mov (0x7dfe),%dl
    //mov $0x00,%dl
    mov $0x02,%ah
    mov $0x01,%al
    int $0x13
    jc error
    ret

error:
    mov $errormsg,%si
    call puts
    hlt
    //ret
    jmp loop

/*
this is a subfunction to display string
usage: mov $address,%si
       call puts
or     mov $label,%si
       call puts
*/
puts:
  movb (%si),%al
  add $1,%si
  cmp $0,%al
  je finish
  movb $0x0e,%ah
  movw $15,%bx
  int $0x10
  jmp puts
finish:
  ;hlt
  ret


msg:
	.asciz "\r\nmy bootloader is running"
my:
    .asciz "\r\nwelcome to our course "

errormsg:
    .asciz "\r\nread u flash failed "

okmsg:
    .asciz "\r\nread  u disk of 2 sector, ok "

.org 510
.word 0xaa55
1:u盘的dr iver number是多少,dl=??
        其实读u盘的第二扇区和读软盘没有什么区别,唯一的不同是我们需要知道u盘的drive number。在调用0x13中断时,dl需要指定一个正确的driver number。

        从书本上我们知道软盘的driver number是0x00,但是u盘的drive number是多少?只要知道了这个driver number,我们就可以读取 u盘的第二个扇区到内存了。

从上面的代码中,可以看到有这样一条代码:

    mov %dl,(0x7dfe)

       不知道大家看懂了没有,其实当bios在读取u盘的512个字节时,已经把u盘的drive number保存到了dl中,我们所做的只是把dl中已经保存的关于u盘的drive number,保存到了内存的0x7dfe处。

       到后面读u盘,调用int 0x13中断,需要给dl赋值为u盘drive number时,再从0x7dfe内存地址把drive number读到dl寄存器中,如下图中所看到,这样就可以正确的读取u盘的第二个扇区了,因为我们得到u盘的drive number。

本部分程序的关键就是上图中,做了标记的两部分,得到u盘的drive number,调用 int 0x13读取u盘的第二扇区


2:关键问题:如何得到u盘的chs结构值?

      因为我们从书中都知道 了软盘是chs=80x2x18的结构,读取软盘的chs时10个柱面时,就比较容易了。

可是如果要读取u盘,我们怎么知道自己的u盘的chs结构呢,关于我们的u盘有多个sector,有多少个head,有多少个cylinder呢?

      这是很多人在读写u盘时遇到的问题。所以在下一节中,博主会拿出一节来,对如何得到u盘的chs的大小进行讲解。下图是通过汇编程序,读到博主自己u盘的chs结构,有了下面的数据,大家就完全知道如何读取u盘的所有扇区了。

好吧,下节再见!有问题记得加群交流哦!be relax!

博主邮箱cherishsir@gmail.com

qq群:159336168

程序文件照例上传到百度云

帐号:cherishsir@gmail.com
密码:cherish

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值