一个项目需要访问没有文件系统的SD 卡,请问需要那些知识 及资料,
当然有人能够做驱动的话,也可以来联系。

解决方案 »

  1.   

    简单呀,不用什么驱动开发,直接读就可以了,把文件地址设置成:
    \\.\{U盘盘符}:
    这样就可以读写了,如:    '读取I盘的第一个扇区数据并保存到指定文件
        Dim buff(511) As Byte
        Dim fs As Long
        Dim ReadSize As Long
        '读取数据过程
        fs = CreateFile("\\.\I:", _
                        GENERIC_READ, _
                        FILE_SHARE_READ, _
                        ByVal 0, _
                        OPEN_EXISTING, _
                        FILE_ATTRIBUTE_ARCHIVE Or FILE_ATTRIBUTE_HIDDEN Or FILE_ATTRIBUTE_SYSTEM Or FILE_ATTRIBUTE_READONLY, _
                        0)
        ReadFile fs, buff(0), 512, ReadSize, ByVal 0
        CloseHandle fs
        '保存数据过程,将读到的数据保存到 C:\boot.bin 文件中
        Open "C:\boot.bin" For Binary As #1
        Put #1, 1, buff
        Close #1这种方法适合与读写软盘、U盘等设备,硬盘分区不适合
      

  2.   

    你干嘛不自己验证一下?
    这种方法我是验证过,我觉得没问题。
    我是用作写 SD 卡的 Bootloader ,用在 ARM11 的 SD 卡启动模式加载系统内核,我用得没问题,你要是用出问题那还真让我长见识了。
      

  3.   

    如果你实在担心,你就直接用BIOS的13h中断来读取也可以,不过杀鸡用牛刀,感觉没那必要
      

  4.   

    虽然Windows整个系统的机制很复杂,但是同样要遵守x86架构的规矩,就是所有的程序都是在CPU里执行,而且这些执行代码符合CPU指令集,而我们的Windows通常都工作在CPU的保护模式(Win3x除外),可以这么说,32位的操作系统都是工作在保护模式的。所以只要编译出的代码符合保护模式的代码,就可以让CPU执行你的的程序,做指定的操作。而 BIOS 中断中有很多功能,即使是操作系统都是基于 BIOS 这些功能写出来的,所以,只要你的程序被系统内核载入到 CPU 中执行,基本上就是内存区域或内存页间访问权限的问题,至于通过BIOS中断操作设备影响不大。所以,如果你写出直接通过 BIOS 中断访问设备的代码,是可以被执行的,不过SD卡通常是USB设备,在底层中是通过操作8259A操作的,所以操作方法可能不能直接用13h操作。
    而windows驱动程序,其实属于Windows内核的一部分存在的,他运行与保护模式下的Ring0层,应用程序运行于Ring3层,他们的区别主要在于GDT或LDT的内存数据间访问问题。在Windows驱动开发当中,通常是通过调用NT_ASI或DDK宏进行开发,其操作数据的模式和访问文件一样,都是上面类似的操作,区别在于使用的文件地址不一样就能访问到设备,为了应用程序能够让驱动程序做指定的工作,所以通过一些API函数将参数通过IRP包形式传递给驱动程序,驱动通过IRP包内容调用不同的驱动执行指定操作,同时也会将处理完成的数据地址返回给IRP包或地址中,应用程序可以根据这些信息得到驱动状态。而驱动开发中有几个概念,总线驱动、过滤驱动、虚拟设备驱动等,而你的需求,基本上以有了总线驱动的支持,有了这个驱动支持,已经可以对你的设备进行读写操作了,根本就无需再做驱动。因为,说到底层,这种外部设备与计算机的接口,主要是以通讯为基础的,如果你不了解外部设备的通讯协议,根本无法写出这种驱动。虽然USB总线和SD卡的通讯协议都是公开的,但既然系统有了驱动,也就没必要再去写了。
      

  5.   

    这是我用同样的方法读出我 SD 卡的Boot扇区内容00000000: EB 58 90 4D 53 44 4F 53 35 2E 30 00 02 04 20 00
    00000010: 02 00 00 00 00 F8 00 00 3F 00 FF 00 00 00 00 00
    00000020: 00 86 07 00 C0 03 00 00 00 00 00 00 02 00 00 00
    00000030: 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000040: 00 00 29 BF 7A 03 64 4E 4F 20 4E 41 4D 45 20 20
    00000050: 20 20 46 41 54 33 32 20 20 20 33 C9 8E D1 BC F4
    00000060: 7B 8E C1 8E D9 BD 00 7C 88 4E 02 8A 56 40 B4 08
    00000070: CD 13 73 05 B9 FF FF 8A F1 66 0F B6 C6 40 66 0F
    00000080: B6 D1 80 E2 3F F7 E2 86 CD C0 ED 06 41 66 0F B7
    00000090: C9 66 F7 E1 66 89 46 F8 83 7E 16 00 75 38 83 7E
    000000A0: 2A 00 77 32 66 8B 46 1C 66 83 C0 0C BB 00 80 B9
    000000B0: 01 00 E8 2B 00 E9 48 03 A0 FA 7D B4 7D 8B F0 AC
    000000C0: 84 C0 74 17 3C FF 74 09 B4 0E BB 07 00 CD 10 EB
    000000D0: EE A0 FB 7D EB E5 A0 F9 7D EB E0 98 CD 16 CD 19
    000000E0: 66 60 66 3B 46 F8 0F 82 4A 00 66 6A 00 66 50 06
    000000F0: 53 66 68 10 00 01 00 80 7E 02 00 0F 85 20 00 B4
    00000100: 41 BB AA 55 8A 56 40 CD 13 0F 82 1C 00 81 FB 55
    00000110: AA 0F 85 14 00 F6 C1 01 0F 84 0D 00 FE 46 02 B4
    00000120: 42 8A 56 40 8B F4 CD 13 B0 F9 66 58 66 58 66 58
    00000130: 66 58 EB 2A 66 33 D2 66 0F B7 4E 18 66 F7 F1 FE
    00000140: C2 8A CA 66 8B D0 66 C1 EA 10 F7 76 1A 86 D6 8A
    00000150: 56 40 8A E8 C0 E4 06 0A CC B8 01 02 CD 13 66 61
    00000160: 0F 82 54 FF 81 C3 00 02 66 40 49 0F 85 71 FF C3
    00000170: 4E 54 4C 44 52 20 20 20 20 20 20 00 00 00 00 00
    00000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    000001A0: 00 00 00 00 00 00 00 00 00 00 00 00 0D 0A 52 65
    000001B0: 6D 6F 76 65 20 64 69 73 6B 73 20 6F 72 20 6F 74
    000001C0: 68 65 72 20 6D 65 64 69 61 2E FF 0D 0A 44 69 73
    000001D0: 6B 20 65 72 72 6F 72 FF 0D 0A 50 72 65 73 73 20
    000001E0: 61 6E 79 20 6B 65 79 20 74 6F 20 72 65 73 74 61
    000001F0: 72 74 0D 0A 00 00 00 00 00 AC CB D8 00 00 55 AA一看 EB 58 90 和最后的 55 AA 就知道,这个是标准的 Boot 引导扇区内容,如果失败的
    话,不可能有这样的引导数据。