无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: 不点
打印 上一主题 下一主题

准备基于 fbinst 进行再开发,请各位提供帮助

    [复制链接]
31#
发表于 2013-12-10 10:45:16 | 只看该作者
回复

使用道具 举报

32#
发表于 2013-12-10 11:25:57 | 只看该作者
下载了,谢谢
回复

使用道具 举报

33#
发表于 2013-12-10 23:29:16 | 只看该作者
mygamexxx 发表于 2013-12-10 08:26
开了两个页面,一个能进去,但等待时间比较长,一个最后显示“无法显示此页”。

进不去就借助GAE,肯定是可以的
回复

使用道具 举报

34#
发表于 2013-12-11 22:29:40 来自手机 | 只看该作者
好消息………………………
回复

使用道具 举报

35#
发表于 2013-12-12 21:01:52 | 只看该作者
后排膜拜大神!
回复

使用道具 举报

36#
发表于 2013-12-14 10:24:16 | 只看该作者
难道是打酱油的!
回复

使用道具 举报

37#
发表于 2013-12-17 16:03:30 | 只看该作者
我来座等测试吧,这个星期完了后,我可以着手测试相关内容,05年至今的电脑都有,几乎涵盖了HP、DELL、IBM、联想等,笔记本有四种:IBM、HP、DELL、三星。新的电脑马上到手主要是DELL和东芝,都可以拿来练手的,随便拆,随便改,用坏了直接换货的。
回复

使用道具 举报

38#
 楼主| 发表于 2013-12-17 18:32:26 | 只看该作者
看到有 “天使的魔翼” 这样有条件的测试者,令人鼓舞。不过,我听说有很多新电脑已经不再支持 BIOS 了(只支持 EFI),因此这会让你的测试直接 “泡汤”。你还是尽量多准备一些旧电脑吧。我们是要保证在旧电脑上有较高的成功率,争取达到不折不扣的 100% 成功率。新电脑是不敢保证的。一方面,新电脑有可能不支持 BIOS,另一方面,即使支持 BIOS,它也可能针对 grub4dos 以及 fbinst 进行新的攻击,这样,我们就不敢保证支持新电脑了。

回复

使用道具 举报

39#
发表于 2013-12-18 18:46:35 | 只看该作者
fbinst兼容性必须增强啊,优盘启动测试必备!!
回复

使用道具 举报

40#
 楼主| 发表于 2013-12-23 23:23:10 | 只看该作者
初步尝试,开始写代码了。目前的 MBR 扇区代码的主框架已经完成。但后续的工作仍然是很繁琐的。

目前暴露出的问题主要是,MBR 里面的代码空间太少了。

MBR 要放个 BPB,这占用 0x60 个字节。

MBR 还得有分区表,这也要占用 0x48 个字节。

两者合起来占用 0xA8 个字节。

剩下的空间只有 0x158 个字节了。

就是说,512 字节当中,有三分之一的空间被 BPB 和分区表占用,剩下的三分之二,空间太小、太紧张。

因此,有很多概念都得简化。比如说,原来打算要智能地分辨出内嵌的究竟是 grldr 还是 ntldr,现在照顾不了 ntldr 了,只对 grldr 给以直接的支持,而 ntldr 的启动则需要用户用 hack 的手段实现,即,用户自己把 ntldr 的代码进行重新包装,以便让系统能够启动它。


这个 MBR 代码会探测出正确的 H 和 S 值,最后,加载位于物理扇区号 190 开始的 1152 个扇区(也就是 576K)。加载的目的地址是 0x7E00,也就是紧跟 0x7C00 之后的那个扇区位置。加载完成后,控制将跳转到 0000:7E00 去执行。

为什么是 576K 呢?这是最大可能的加载长度,如果再大,就有可能与常规内存顶部的 EBDA 相冲突了。我们假定这 576K 是 grldr 文件的内容。其实,任何代码都可以放在这里,不一定非得是 grldr。

由于 grldr 的内置菜单可以是 LZMA 压缩格式并且带有字库,因此,grldr 的体积可能会很大,用户有可能制作出一个很大的 grldr 文件。而加载一个 576K 的大文件,基本可以满足这方面的需要了。

简言之,这个单扇区的 MBR 代码,在完成 CHS 探测之后,立即加载内嵌的 GRLDR 文件。探测 CHS 的过程类似于 fbinst 的做法,需要 8M 的空间。


点评

不点大哥,您没想过压缩的力量吗?可以这样做:设置三部分代码:第一部分:探测CHS,在MBR的位置,然后读(比如说190-191)扇区、加载。第二部分、比如说190-191扇区放置解压代码,解压更复杂的功能。第三部分:比如  详情 回复 发表于 2014-1-19 13:39
可以设置两部分代码:一、CHS探测代码,在MBR的位置,然后读(比如说190-191)扇区、加载。190-191扇区放置解压代码,解压更复杂的功能,比如说解压放在192-195扇区的代码,然后从195-1342扇区开始加载用户引导器。  发表于 2014-1-19 13:36
回复

使用道具 举报

41#
发表于 2013-12-24 09:07:46 来自手机 | 只看该作者
每天都来关注有没有进展…项目开始了就好…
回复

使用道具 举报

42#
发表于 2013-12-24 15:29:53 | 只看该作者
期待更好的工具诞生,支持!
回复

使用道具 举报

43#
 楼主| 发表于 2013-12-25 20:56:24 | 只看该作者
现在能够在开始的时候打印出 DL 的值了。目前是采用直接写屏显示信息,不采用 BIOS 的 INT10 视频功能调用。

打印 DL 的值之后,等待 3 秒钟,以便用户确实能够看见它。

仔细想想,其实,能够打印出信息,这一点是很重要的。别小看它,这不是一件可以忽略的小事。假如没有信息显示,则当失败情况出现时,用户无法了解其失败的根源,也无法给开发者提供有用的描述。

至于说打印的内容,倒不是很重要。随便打印一个内容便可,只要能够让用户明白,我们的 MBR 代码确实已经成功从 BIOS 那里获得了控制权便可。究竟是获得控制权了?还是没有获得?这是清楚明白的,而不至于模棱两可、说不清楚。走一步是一步,做好记号,让开发、探索的过程透明。

这就像嫦娥登月,开始的时候,先确定能够绕行,然后再尝试落下去。落下去之后,再看看那里有什么新情况。每一步都要扎实可靠。

先前的 fbinst 就做了很好的工作,提供了很多有价值的信息,成为我们进一步发展的良好开端。


这次改进的一个方面,就是要在正式的版本中嵌入调试信息。如果正式版中缺乏必要的、关键的调试信息,那就不方便用户报告问题。

用户遇到问题,不一定有时间、有精力来寻找专门的调试版,甚至也不一定会使用调试版。正式版往往随某个第三方的发行版一起发行,而调试版往往是被忽略的。最终用户因为有了高手们制作的傻瓜化的正式版而很快 “适应” 了,故而甚至他们自己不知道怎么使用调试版。这种情况就造成了调试版与正式版的脱节。

因此,在正式版里面嵌入调试信息,不再单独发行调试版,这是一个很重要的改进。


在道理上澄清这一认识之后,还存在着 “实际可行性” 的问题。

其实这在技术上是有难度的,不容易在狭小的空间里面嵌入很多调试信息。

目前做到了以下几点:

1、打印初始的 DL 信息,并等待 3 秒。

2、用 CHS 模式读逻辑扇区0,从而得知隐藏的扇区数。

3、判断是否支持 LBA 模式。如果支持 LBA 模式,则接下来就使用 LBA 模式来读盘。

4、如果不支持 LBA 模式,则探测 CHS 参数,并用 CHS 模式读盘。

5、可以读取连续多个(比如说1152个)扇区到内存 0x7E00 并递交控制权。

6、在保持 1152 个扇区不记录物理扇区号的情况下,依旧能够完成几何参数的探测。

7、读盘出现失败时,能够显示 “disk fail” 信息。

虽然实现了以上这些功能,但是,0x1A8 字节的代码空间也用光了。而且,这个代码已经进行了充分的优化,很难再通过技术性的手段来节约空间了。然而,这个 “首扇区” 里面的调试信息太少,需要继续塞入其他几个比较关键的调试信息。那就得取消某些功能了。以下两个功能在原则上是可以考虑取消的:

1、取消 LBA 支持功能,这能够节约不少空间。首扇区可以考虑取消 LBA 支持功能,留待第二阶段的次级扇区对这一功能进行增补。
2、取消 1152 个空白扇区的设置,这样会让探测的逻辑更简单,也能够切实减少占用 “首扇区” 里面的宝贵空间。

如果首扇区的打印信息很重要,而且信息又比较多,那可能就得把上述两个功能都取消。目前打算先取消 1152 个空白扇区,然后试试看可否加入足够的调试信息。

回复

使用道具 举报

44#
 楼主| 发表于 2013-12-25 21:34:01 | 只看该作者
我把楼上所说的阶段性的代码贴出来,一方面是作为一个备份来防止代码丢失,另一方面也许有人对此感兴趣,那就可以帮助开发完善了。目前这个代码还没有取消楼上在结尾处所谈到的 “拥有 1152 空白扇区” 的功能。

这个代码编译完成后,已经抵达偏移 0x1B7 了,也就是说,连一个字节的剩余空间都没有了。从偏移 0x1B8 开始,那是大家熟悉的微软磁盘签名以及分区表。

  1.         .text
  2.         .code16

  3. start:
  4.         jmp        1f

  5.         . = start + 0x02

  6.         .byte        0x90

  7.         . = start + 0x03

  8.         .ascii        "MSWIN4.1"

  9.         . = start + 0x0B

  10.         .word        0x200

  11.         . = start + 0x0D

  12.         /* Sectors per cluster. Valid values are 1, 2, 4, 8, 16, 32, 64 and 128.
  13.          * But a cluster size larger than 32K should not occur.
  14.          */

  15.         .byte        0x01        // sectors per cluster, should be changed by installer

  16.         . = start + 0x0E

  17.         .word        0x0001        // reserved sectors, should be changed by installer

  18.         . = start + 0x10

  19.         .byte        0x02        // number of FATs

  20.         . = start + 0x11

  21.         .word        0        // FAT12/16 root dir entries. Must be 0

  22.         . = start + 0x13

  23.         .word        0        // FAT12/16 total sectors. Must be 0

  24.         . = start + 0x15

  25.         .byte        0xF8        // media descriptor

  26.         . = start + 0x16

  27.         .word        0        // FAT12/16 sectors per FAT. Must be 0

  28.         . = start + 0x18

  29.         .word        0x3f        // sectors per track

  30.         . = start + 0x1A

  31.         .word        0xff        // number of heads

  32.         . = start + 0x1C

  33.         .long        0        // hidden sectors, should be changed by installer

  34.         . = start + 0x20

  35.         .long        0        // total sectors, should be changed by installer

  36.         . = start + 0x24

  37.         .long        0        // sectors per FAT, should be changed by installer

  38.         . = start + 0x28

  39.         .word        0        // current active FAT

  40.         . = start + 0x2A

  41.         .word        0        // FAT32 revision number

  42.         . = start + 0x2C

  43.         .long        0        // root dir starting cluster

  44.         . = start + 0x30

  45.         .word        0        // file system information sector number

  46.         . = start + 0x32

  47.         .word        6        // boot record backup sector number

  48.         . = start + 0x34

  49.         .long        0        // reserved
  50.         .long        0        // reserved
  51.         .long        0        // reserved

  52.         . = start + 0x40

  53.         .byte        0x80        // drive number

  54.         . = start + 0x41

  55.         .byte        0

  56.         . = start + 0x42

  57.         /* Signature (must be 28h or 29h to be recognised by NT). */

  58.         .byte        0x29                // extended boot signature for FAT12/FAT16

  59.         . = start + 0x43

  60.         .long        0x0AC4AF63        // volume serial number

  61.         . = start + 0x47

  62.         .ascii        "NO NAME    "        // volume label, 11 bytes

  63.         . = start + 0x52

  64.         .ascii        "FAT32   "        // filesystem ID, 8 bytes

  65.         . = start + 0x5A

  66.         .word        0        // reserved
  67.         .word        0        // reserved
  68.         .word        0        // reserved

  69.         . = start + 0x60

  70. 1:
  71.         xorw        %di, %di
  72.         movw        %di, %ds        /* constant DS=0 */
  73.         movw        $0x7C00, %bp        /* constant BP=0x7C00 */

  74.         movw        %di, %ss        /* constant SS=0 */
  75.         movw        %bp, %sp

  76.         movb        %dl, 0x40(%bp)        /* assume BIOS pass correct drive number. */

  77.         /* Got control! Print DL on the screen. */
  78.         movw        $0xB800, %bx
  79.         movw        %bx, %es
  80.         xchgw        %ax, %dx        /* DX -> AX */
  81.         /* Undocumented AAM instruction Opcode: D4 imm8 */
  82.         .byte        0xD4, 0x10        // AH= AL / 16, AL= AL % 16
  83.         addw        $0x3030, %ax
  84.         xchgw        %ax, %dx
  85.         movb        %dh, %al
  86.         movb        $0x9F, %ah        # back/fore ground=bright blue/white
  87.         cld
  88.         stosw                        /* DI=2 */
  89.         xchgw        %ax, %dx
  90.         movb        $0x9F, %ah        # back/fore ground=bright blue/white
  91.         stosw                        /* DI=4 */

  92.         /* sleep 3 seconds */

  93.         movw        $55, %cx        /* 55 / 18.2 = 3 seconds */
  94. 1:
  95.         movl        0x46c, %eax        /* get old timer counter */
  96.         sti                        /* enable interrupt for int8 timer */
  97.         cmpl        0x46c, %eax        /* timer counter changed by int8 ? */
  98.         je        1b                /* user will report it if it hangs here */
  99.         loop        1b                /* no change, wait a timer interrupt */

  100.         /* DI=4 */
  101.         //movw        $4, %di                /* try 4 times on read failure */
  102.         movw        %di, 0x18(%bp)        /* set a known value 4: sectors per track */
  103.         movw        %di, 0x1a(%bp)        /* set a known value 4: number of heads */

  104.         pushw        $0x0201        //---        /* BP-2 point to int13/AX: read 1 sector */

  105.         /* read C/H/S=0/0/1 to 0000:7E00 */
  106.         xorw        %ax, %ax
  107.         movw        %ax, %es
  108.         movw        $0x7E00, %bx
  109.         pushw        %es        //---
  110.         pushw        %bx        //---        /* BP-6 point to 0x00007E00 on stack */
  111.         movw        $1, %cx                /* read 1 sector */
  112.         call        readDisk        /* CX=1, DX=0 */

  113.         pushw        0x0E(%bx) //---        /* save sector serial number at BP-8 */

  114.         movb        $0x41, %ah
  115.         movw        $0x55AA, %bx
  116.         call        int13
  117.         jc        1f                /* no ebios */
  118.         subw        $0xAA55, %bx
  119.         jnz        1f                /* no ebios */
  120.         //testb        $1, %cl
  121.         //jz        1f
  122.         .byte        0xD0, 0xD9        // RCR CL,1; D0 C9  ROR CL,1 also OK
  123.         jnc        1f                /* no ebios */

  124.         movb        $0x42, -1(%bp)        /* LBA supported */

  125. geometry_OK:

  126.         /* read GRLDR to 0000:7E00 */
  127.         /* calculate grldr starting sector number */
  128.         /* grldr serial number = (0x28 + 126 + 255*63 - 190) */
  129.         movw        -8(%bp), %ax
  130.         subw        $(0x28 + 126 + (255*63) - 190), %ax
  131.         //cdq                        /* EDX=0 */
  132.         lesw        -6(%bp), %bx        /* ES:BX=0000:7E00 */
  133.         //xorl        %ecx, %ecx
  134.         movw        $1152, %cx        /* read 576K grldr */
  135.         call        readDisk        /* CX=1152, DX=0 */

  136.         movb        0x40(%bp), %dl
  137.         movb        $0xFF, %dh
  138.         pushw        %dx

  139.         //ljmp        $0, $0x7E00
  140.         pushw        %ds                /* DS=0 */
  141.         pushw        %bx                /* BX=0x7E00 */
  142.         lret
  143. 1:

  144.         /* no LBA */

  145.         /* XXX: should confirm 0x18(%bp)=63, 0x1A(%bp)=255 */

  146.         /* read C/H/S=0/1/1 to 0000:7E00 */
  147.         //xorl        %eax, %eax
  148.         movw        %di, %ax        /* AX=4, start sector number */
  149.         //cdq                        /* EDX=0 */
  150.         lesw        -6(%bp), %bx        /* ES:BX=0000:7E00 */
  151.         movw        $1, %cx                /* read 1 sector */
  152.         call        readDisk        /* CX=1, DX=0 */

  153.         movw        -8(%bp), %ax
  154.         subw        0x0E(%bx), %ax        /* the real sectors per track */
  155.         pushw        %ax        //---        /* save it at BP-10 */
  156.         pushw        %dx        //---        /* initial 0 at BP-12 */
  157.         //movb        %al, 0x18(%bp)        /* update it! */

  158.         /* read C/H/S=1/0/1 to 0000:7E00 */
  159.         movw        $21, %cx
  160.         xorw        %ax, %ax
  161. 1:
  162.         addw        $(4*4), %ax        /* 16=sectors per cylinder */
  163.         movw        -10(%bp), %dx
  164.         addw        %dx, -12(%bp)
  165.         pushw        %cx
  166.         pushw        %ax
  167.         //cdq                        /* EDX=0 */
  168.         lesw        -6(%bp), %bx        /* ES:BX=0000:7E00 */
  169.         //xorl        %ecx, %ecx
  170.         movw        %di, %cx        /* read 4 sectors */
  171.         call        readDisk        /* CX=4, DX=0 */

  172.         movw        0x0E(%bx), %ax
  173.         movw        %ax, %cx
  174.         decw        %ax
  175.         cmpw        0x20E(%bx), %ax
  176.         jne        2f
  177.         decw        %ax
  178.         cmpw        0x40E(%bx), %ax
  179.         jne        2f
  180.         decw        %ax
  181.         cmpw        0x60E(%bx), %ax
  182.         jne        2f
  183.         movw        -8(%bp), %ax
  184.         subw        %cx, %ax        /* sectors in cylinders */
  185.         divw        -12(%bp)        /* rem=DX, should be 0 */
  186.                                 /* quo=AX, number of heads */

  187.         /* XXX: if DX != 0, here should halt! */

  188.         movw        %ax, 0x1A(%bp)        /* update number of heads! */
  189.         movb        -12(%bp), %al
  190.         movb        %al, 0x18(%bp)        /* update sectors per track! */
  191.         jmp        geometry_OK        /* ready to load GRLDR */       
  192. 2:
  193.         popw        %ax
  194.         popw        %cx
  195.         loop        1b
  196. 1:
  197.         hlt
  198.         jmp        1b

  199. /* Read sectors from disk, using LBA or CHS
  200. * input:        AX    = 16-bit LBA sector number, and AX <= 0x7FFF
  201. *                CX    = number of sectors to read
  202. *                ES:BX = destination buffer
  203. *                SS    = DS
  204. *                BP+0x18 -> sectors per track
  205. *                BP+0x1A -> number of heads
  206. *                BP+0x40 -> drive number
  207. *
  208. * output:        No return on error
  209. *                BX not changed
  210. *                CX not changed
  211. *                ES    = ES + 0x20 * CX
  212. *                AX    = AX + CX
  213. *                DX    = 0
  214. *                ZF    = 0
  215. *                CF    = 0
  216. */

  217. readDisk:
  218.         cwd                        /* DX=0 */
  219. 2:
  220.         pushaw
  221.         pushw        %dx                /* 0 */
  222.         pushw        %dx                /* 0 */
  223.         pushw        %dx                /* 0 */
  224.         pushw        %ax                /* lo 16bit of sector number */
  225.         pushw        %es                /* buffer segment */
  226.         pushw        %bx                /* buffer offset */
  227.         pushw        $1                /* 1 sector to read */
  228.         pushw        $16                /* size of this parameter block */

  229.         cmpb        $0x42, -1(%bp)        /* LBA supported */
  230.         je        1f                /* LBA mode */

  231.         /* CHS mode */
  232.         divw        0x18(%bp)        /* rem=DX */
  233.                                 /* quo=AX */
  234.                                 /* DH=0 */
  235.         incw        %dx                /* DL=sector number */
  236.         xchgw        %dx, %cx        /* CH=0, CL=sector number */

  237.         cwd                        /* DX=0 */
  238.         divw        0x1A(%bp)        /* rem=DX */
  239.                                 /* quo=AX, cylinder number */
  240.                                 /* DH=0, DL=head number */

  241.         xchgb        %dl, %dh        /* DL=0, DH=head number */
  242.         xchgb        %al, %ch        /* AL=0, CH=lo 8bit cylinder */
  243.         //shlb        $6, %ah                /* hi 2bit cylinder ... */
  244.         //orb        %ah, %cl        /* ... should be in CL */
  245.         shrw        $2, %ax                /* hi 2bit cylinder ... */
  246.         orb        %al, %cl        /* ... should be in CL */
  247.         testb        %ah, %ah
  248.         jnz        disk_error        /* cylinder overflow */
  249. 1:
  250.         movw        -2(%bp), %ax        /* (E)BIOS read 1 sector */
  251.         movw        %sp, %si        /* DS:SI points to disk address packet */
  252.         movb        0x40(%bp), %dl        /* drive number */
  253.         pushw        %es
  254.         call        int13_retry
  255.         popw        %bx
  256.         //jc        disk_error
  257.         leaw        0x20(%bx), %bx
  258.         movw        %bx, %es
  259.         popaw                        /* remove parameter block from stack */
  260.         popaw
  261.         incw         %ax                /* next sector, here ZF=0 */
  262.         loop        2b
  263.         ret

  264. //        . = . - (. - readDisk)/68

  265. int13_retry:
  266.         //movw        $4, %di                /* try 4 times on failure */
  267. 1:
  268.         pushaw
  269.         call        int13
  270.         popaw
  271.         jc        2f
  272.         ret
  273. 2:
  274.         pushaw
  275.         cbw                        /* AH=0, reset disk */
  276.         //xorw        %ax, %ax        /* reset disk */
  277.         call        int13
  278.         popaw
  279.         decw        %di
  280.         jnz        1b

  281. disk_error:

  282.         movw        $(msg_DiskReadError - start + 0x7c00), %si

  283. //boot_error:

  284. /* prints string DS:SI (modifies AX BX SI) */
  285. 1:
  286.         lodsb        (%si), %al        /* get token */
  287.         //xorw        %bx, %bx        /* video page 0 */
  288.         movb        $0x0e, %ah        /* print it */
  289.         int        $0x10                /* via TTY mode */
  290.         cmpb        $0, %al                /* end of string? */
  291.         jne        1b                /* until done */

  292. 1:        jmp        1b


  293. int13:
  294.         pushw        %ds
  295.         pushw        %es
  296. //        pushw        %bx        /* int13/ah=41h use BX, so do not save. */
  297. //        pushw        %dx        /* drive number already saved in memory. */
  298.         pushw        %si
  299.         pushw        %di
  300.         pushw        %bp
  301.         stc
  302.         int        $0x13
  303.         sti
  304.         popw        %bp
  305.         popw        %di
  306.         popw        %si
  307. //        popw        %dx
  308. //        popw        %bx
  309.         popw        %es
  310.         popw        %ds
  311.         ret

  312. msg_DiskReadError:

  313.         .ascii        "disk fail\0"
复制代码


回复

使用道具 举报

45#
发表于 2013-12-26 10:43:40 | 只看该作者
巨大的好消息,十分具有穿透力。期待的很。
回复

使用道具 举报

46#
 楼主| 发表于 2013-12-27 02:09:02 | 只看该作者
这次去掉了 1152 个空白扇区,增加了调试输出信息。

  1.         . = start + 0x60

  2. 1:
  3.         xorw        %di, %di
  4.         movw        %di, %ds        /* constant DS=0 */
  5.         movw        $0x7C00, %bp        /* constant BP=0x7C00 */

  6.         movw        %di, %ss        /* constant SS=0 */
  7.         movw        %bp, %sp

  8.         movb        %dl, 0x40(%bp)        /* assume BIOS pass correct drive number. */

  9.         /* Got control! */

  10.         /* print DX */
  11.         xchgw        %ax, %dx        /* store DX into AX */
  12.         call        print_hex        # BX changed

  13.         /* print serial number of this sector */
  14.         movw        0x0E(%bp), %ax
  15.         call        print_hex        # BX changed

  16.         /* sleep 3 seconds */

  17.         sti                        /* enable interrupt for int8 timer */
  18.         movw        $55, %cx        /* 55 / 18.2 = 3 seconds */
  19. 2:
  20.         movw        0x46c, %ax        /* get new ticks */
  21.         cmpw        %ax, %bx        /* changed? */
  22.         je        2b                /* no, continue to wait */
  23.         /* ticks changed by int8 */
  24.         xchgw        %ax, %bx        /* update ticks */
  25.         loop        2b

  26.         /* CX=0 */

  27.         pushw        $0x0201        //---        /* BP-2 point to int13/AX: read 1 sector */

  28.         /* read C/H/S=0/0/1 to 0000:7E00 */
  29.         /* Generally, it is safe enough. */
  30.         xorw        %ax, %ax
  31.         movw        %ax, %es
  32.         movw        $0x7E00, %bx
  33.         pushw        %es        //---
  34.         pushw        %bx        //---        /* BP-6 point to 0x00007E00 on stack */
  35.         incw        %cx                /* read 1 sector */
  36.         call        readDisk        /* CX=1, DX=0 */

  37.         incw        %cx                /* CX=2 */
  38.         movw        %cx, 0x18(%bp)        /* interim sectors per track */
  39.         movw        %cx, 0x1a(%bp)        /* interim number of heads */

  40.         movw        0x0E(%bx), %si        # mbr0

  41.         /* print serial number of mbr0 */
  42.         movw        %si, %ax
  43.         call        print_hex        # BX changed

  44.         /* check LBA support */
  45.         /* This can also be considered safe. */
  46.         movb        $0x41, %ah
  47.         movw        $0x55AA, %bx
  48.         call        int13
  49.         jc        1f                /* no ebios */
  50.         cmpw        $0xAA55, %bx
  51.         jnz        1f                /* no ebios */
  52.         //testb        $1, %cl
  53.         //jz        1f
  54.         .byte        0xD0, 0xD9        # RCR CL,1; D0 C9  ROR CL,1 also OK
  55.         jnc        1f                /* no ebios */

  56.         movb        $0x42, -1(%bp)        /* LBA supported */

  57.         /* print "AA55" */
  58.         xchgw        %ax, %bx        /* store BX into AX */
  59.         call        print_hex        # BX changed

  60.         jmp        geometry_OK        /* ready to load GRLDR */       

  61. 1:

  62.         /* CHS mode. Must determine geometry. */

  63.         /* read C/H/S=0/1/1 to 0000:7E00 */
  64.         movw        $2, %ax                /* AX=2, interim sectors per track */
  65.         lesw        -6(%bp), %bx        /* ES:BX=0000:7E00 */
  66.         movw        $1, %cx                /* read 1 sector */
  67.         call        readDisk        # AX=3, CX=1, DX=0

  68.         movw        %si, %ax        # mbr0
  69.         subw        0x0E(%bx), %ax        /* real sectors per track */
  70.         jbe        disk_error        /* installation problem? */
  71.         movw        %ax, 0x18(%bp)        /* update sectors per track! */

  72.         /* print real sectors per track */
  73.         call        print_hex        # BX changed

  74.         cmpw        $63, %ax
  75.         ja        disk_error        /* installation problem? */

  76.         /* read C/H/S=1/0/1 to 0000:7E00 */
  77.         shlw        $1, %ax                /* AX=interim sectors per cylinder */
  78.         lesw        -6(%bp), %bx        /* ES:BX=0000:7E00 */
  79.         //movw        $1, %cx                /* read 1 sector */
  80.         call        readDisk        # AX=5, CX=1, DX=0

  81.         movw        %si, %ax        # mbr0
  82.         subw        0x0E(%bx), %ax        /* real sectors per cylinder */
  83.         jbe        disk_error        /* installation problem? */

  84.         /* DX=0 */
  85.         divw        0x18(%bp)        /* rem=DX, should be 0 */
  86.                                 /* quo=AX, number of heads */

  87.         /* if DX != 0, stop! */
  88.         testw        %dx, %dx
  89.         jnz        disk_error        /* installation problem? */

  90.         movw        %ax, 0x1A(%bp)        /* update number of heads! */

  91.         /* print real number of heads */
  92.         call        print_hex        # BX changed

  93.         cmpw        $0xFF, %ax
  94.         ja        disk_error        /* installation problem? */

  95. geometry_OK:

  96.         /* read GRLDR to 0000:7E00 */
  97.         /* calculate grldr starting sector number */
  98.         /* grldr serial number = (0x21 + 126 + 255*63 - 190) */
  99.         movw        %si, %ax        # mbr0
  100.         subw        $(0x21 + 126 + (255*63) - 190), %ax
  101.         lesw        -6(%bp), %bx        /* ES:BX=0000:7E00 */
  102.         movw        $1152, %cx        /* read 576K grldr */
  103.         call        readDisk        /* CX=1152, DX=0 */

  104.         movb        0x40(%bp), %dl
  105.         movb        $0xFF, %dh
  106.         pushw        %dx

  107.         //ljmp        $0, $0x7E00
  108.         pushw        %ds                /* DS=0 */
  109.         pushw        %bx                /* BX=0x7E00 */
  110.         lret

  111. /* Read sectors from disk, using LBA or CHS
  112. * input:        AX    = 16-bit LBA sector number
  113. *                CX    = number of sectors to read
  114. *                AX + CX <= 0x8000
  115. *                ES:BX = destination buffer
  116. *                SS    = DS
  117. *                BP-0x02 -> function call number for AX
  118. *                BP+0x18 -> sectors per track
  119. *                BP+0x1A -> number of heads
  120. *                BP+0x40 -> drive number
  121. *
  122. * output:        No return on error
  123. *                BX not changed
  124. *                CX not changed
  125. *                ES    = ES + 0x20 * CX
  126. *                AX    = AX + CX
  127. *                DX    = 0
  128. *                ZF    = 0
  129. *                CF    = 0
  130. */

  131. readDisk:
  132.         cwd                        /* DX=0 */
  133. 2:
  134.         pushaw
  135.         pushw        %dx                /* 0 */
  136.         pushw        %dx                /* 0 */
  137.         pushw        %dx                /* 0 */
  138.         pushw        %ax                /* lo 16bit of sector number */
  139.         pushw        %es                /* buffer segment */
  140.         pushw        %bx                /* buffer offset */
  141.         pushw        $1                /* 1 sector to read */
  142.         pushw        $16                /* size of this parameter block */

  143.         cmpb        $0x42, -1(%bp)        /* LBA supported */
  144.         je        1f                /* LBA mode */

  145.         /* CHS mode */
  146.         divw        0x18(%bp)        /* rem=DX */
  147.                                 /* quo=AX */
  148.                                 /* DH=0 */
  149.         incw        %dx                /* DL=sector number */
  150.         xchgw        %dx, %cx        /* CH=0, CL=sector number */

  151.         cwd                        /* DX=0 */
  152.         divw        0x1A(%bp)        /* rem=DX */
  153.                                 /* quo=AX, cylinder number */
  154.                                 /* DH=0, DL=head number */

  155.         xchgb        %dl, %dh        /* DL=0, DH=head number */
  156.         xchgb        %al, %ch        /* AL=0, CH=lo 8bit cylinder */
  157.         //shlb        $6, %ah                /* hi 2bit cylinder ... */
  158.         //orb        %ah, %cl        /* ... should be in CL */
  159.         shrw        $2, %ax                /* hi 2bit cylinder ... */
  160.         orb        %al, %cl        /* ... should be in CL */
  161.         testb        %ah, %ah
  162.         jnz        disk_error        /* cylinder overflow */
  163. 1:
  164.         movw        -2(%bp), %ax        /* (E)BIOS read 1 sector */
  165.         movw        %sp, %si        /* DS:SI points to disk address packet */
  166.         //movb        0x40(%bp), %dl        /* drive number */
  167.         pushw        %es
  168.         call        int13_retry
  169.         popw        %bx
  170.         //jc        disk_error
  171.         leaw        0x20(%bx), %bx
  172.         movw        %bx, %es
  173.         popaw                        /* remove parameter block from stack */
  174.         popaw
  175.         incw         %ax                /* next sector, here ZF=0 */
  176.         loop        2b
  177.         ret

  178. //        . = . - (. - readDisk)/68

  179. int13_retry:
  180.         movw        $3, %di                /* try 3 times on failure */
  181. 1:
  182.         pushaw
  183.         call        int13
  184.         popaw
  185.         jc        2f
  186.         ret
  187. 2:
  188.         pushaw
  189.         cbw                        /* AH=0, reset disk */
  190.         //xorw        %ax, %ax        /* reset disk */
  191.         call        int13
  192.         popaw
  193.         decw        %di
  194.         jnz        1b

  195. disk_error:
  196.         //movw        $0xDEAD, %ax
  197.         movw        $0xACCE, %ax        # disk access error
  198.         call        print_hex        # BX changed

  199. 1:        jmp        1b


  200. int13:
  201.         pushw        %ds
  202.         pushw        %es
  203. //        pushw        %bx        /* int13/ah=41h use BX, so do not save. */
  204. //        pushw        %dx        /* drive number already saved in memory. */
  205.         pushw        %si
  206.         pushw        %di
  207.         pushw        %bp
  208.         stc
  209.         movb        0x40(%bp), %dl        /* drive number */
  210.         int        $0x13
  211.         sti
  212.         popw        %bp
  213.         popw        %di
  214.         popw        %si
  215. //        popw        %dx
  216. //        popw        %bx
  217.         popw        %es
  218.         popw        %ds
  219.         ret



  220. print_hex:
  221.         # input                AX = value to print
  222.         #                DI = video text offset
  223.         #
  224.         # output        ES = 0xB800
  225.         #                DF = 0
  226.         #                DI = changed
  227.         #                BX = changed
  228.         pushw        $0xB800
  229.         popw        %es                # text mode video memory

  230.         cld
  231.         pushw        %ax
  232.         pushw        %cx
  233.         pushw        %bx
  234.         movw        $4, %cx
  235.         xchgw        %ax, %bx
  236. 1:
  237.         rol        $4, %bx
  238.         movw        %bx, %ax
  239.         andb        $0x0F, %al
  240.         cmpb        $10, %al
  241.         jb        2f
  242.         addb        $7, %al
  243. 2:
  244.         addb        $0x30, %al
  245.         movb        $0x9F, %ah        # back/fore ground=bright blue/white
  246.         stosw
  247.         loop        1b
  248.         movw        $0x2F20, %ax        # back/fore ground=green/bright white
  249.         stosw
  250.         popw        %bx
  251.         popw        %cx
  252.         popw        %ax
  253.         ret

复制代码

回复

使用道具 举报

47#
发表于 2013-12-27 15:56:52 | 只看该作者
  今天中午花了近一小时时间来学习上述两段代码,由于已经很多年没有继续学习这方面的知识,所以学习起来很吃力;让人感觉不点大师花了很大的精力对代码进行设计,目前正在利用一台本本搭建编译环境,由于工作原因,时间有限,只有利用休息时间进行了。

  再谈点不成熟的想法吧,当初开发WEE的时候,我一直在想有什么实用吗?到最后chenall大大开发出自用的“基于grub4dos的硬盘工具箱”,引导程序WEE+GRUB4DOS,我想不点大师可以考虑直接取消一些高级手工调试功能,或者类似于WEE一样,保留一些基本命令就行了;采取G4D现在发展模式,基本+模块+调用;
  再说一下关于调试部分,可以进一步深化,可以借鉴一些U盘检测工具的做法,在虚拟环境下对U盘进行调试,最方便的做法是:U盘启动到DOS下,运行批处理切换至G4D环境,调用FBINST环境,使用模块化检测U盘是否能适应启动,然后保存至TXT文本,供开发人员检查。
  以上一些想法有些地方不是很成熟,只不过提出一个概念:

      

回复

使用道具 举报

48#
 楼主| 发表于 2013-12-27 23:01:57 | 只看该作者
又做了一些优化的工作,节约了几个字节。现在比较满意了。

1152 扇区的外部引导器(GRLDR)是含有物理扇区号记录的,因此,还需要在加载 GRLDR 引导扇区之后,进行一些整理。由于已经加载了 1152 个扇区到 0000:7E00 了,因此,这开头的扇区就要负责这些整理工作了。

开头这个扇区,权且当作 MBR “首扇区” 引导器的第二阶段辅助代码吧。就是说,这 1152 个扇区最开头的扇区,是引导器自己的补充、辅助代码。紧接着的下一个扇区,才是外部引导器的开始。也就是说,外部引导器本身只有 1151 个扇区了。如果将来某个时候有人希望增加辅助代码的功能,增加辅助扇区的个数,那只需要(用户或第三方开发者)自己安排辅助扇区数量、代码以及 grldr 的位置便可。两者的总扇区数是不变的,即,1152 个扇区。

目前,我们的目的仅仅是加载 grldr 而已,因此,一个辅助扇区已经绰绰有余了。辅助扇区的功能虽然简单,但是这个工作还是需要做的,不能省略掉。接下来就准备写辅助扇区的代码了。


  1.         . = start + 0x60

  2. 1:
  3.         xorw        %di, %di
  4.         movw        %di, %ds        /* constant DS=0 */
  5.         movw        $0x7C00, %bp        /* constant BP=0x7C00 */

  6.         movw        %di, %ss        /* constant SS=0 */
  7.         movw        %bp, %sp

  8.         /* save DL first */
  9.         movb        %dl, 0x40(%bp)        /* assume BIOS pass correct drive number. */

  10.         /* Got control! */

  11.         /* print DX */
  12.         xchgw        %ax, %dx        /* store DX into AX */
  13.         call        print_hex        # BX changed

  14.         /* print serial number of this sector */
  15.         movw        0x0E(%bp), %ax
  16.         call        print_hex        # BX changed

  17.         /* sleep 3 seconds */

  18.         sti                        /* enable interrupt for int8 timer */
  19.         movw        $55, %cx        /* 55 / 18.2 = 3 seconds */
  20. 2:
  21.         movw        0x46c, %ax        /* get new ticks */
  22.         cmpw        %ax, %bx        /* changed? */
  23.         je        2b                /* no, continue to wait */
  24.         /* ticks changed by int8 */
  25.         xchgw        %ax, %bx        /* update ticks */
  26.         loop        2b

  27.         /* CX=0 */

  28.         pushw        $0x0201        //---        /* BP-2 point to int13/AX: read 1 sector */

  29.         /* read C/H/S=0/0/1 to 0000:7E00 */
  30.         /* Generally, it is safe enough. */
  31.         xorw        %ax, %ax
  32.         movw        %ax, %es
  33.         movw        $0x7E00, %bx
  34.         pushw        %es        //---
  35.         pushw        %bx        //---        /* BP-6 point to 0x00007E00 on stack */
  36.         incw        %cx                /* read 1 sector */
  37.         call        readDisk        /* CX=1, DX=0 */

  38.         pushw        %cx                /* 1, no POP in LBA branch. See below. */
  39.         incw        %cx                /* CX=2 */
  40.         movw        %cx, 0x18(%bp)        /* interim sectors per track */
  41.         movw        %cx, 0x1a(%bp)        /* interim number of heads */
  42.         pushw        %cx                /* 2, no POP in LBA branch. See below. */

  43.         movw        0x0E(%bx), %si        # mbr0

  44.         /* print serial number of mbr0 */
  45.         movw        %si, %ax
  46.         call        print_hex        # BX changed

  47.         /* check LBA support */
  48.         /* This can also be considered safe. */
  49.         movb        $0x41, %ah
  50.         movw        $0x55AA, %bx
  51.         call        int13
  52.         jc        1f                /* no ebios */
  53.         cmpw        $0xAA55, %bx
  54.         jnz        1f                /* no ebios */
  55.         //testb        $1, %cl
  56.         //jz        1f
  57.         .byte        0xD0, 0xD9        # RCR CL,1; D0 C9  ROR CL,1 also OK
  58.         jnc        1f                /* no ebios */

  59.         movb        $0x42, -1(%bp)        /* LBA supported */

  60.         /* print "AA55" */
  61.         xchgw        %ax, %bx        /* store BX into AX */
  62.         call        print_hex        # BX changed

  63.         /* Keep the pushed 1 and 2 on stack without POPs. There is no harm. */
  64.         jmp        geometry_OK        /* ready to load GRLDR */       

  65. 1:

  66.         /* CHS mode. Must determine geometry. */

  67.         /* read C/H/S=0/1/1 to 0000:7E00 */
  68.         //movw        $2, %ax                /* AX=2, interim sectors per track */
  69.         popw        %ax                /* AX=2, interim sectors per track */
  70.         lesw        -6(%bp), %bx        /* ES:BX=0000:7E00 */
  71.         popw        %cx                /* CX=1, read 1 sector */
  72.         call        readDisk        # AX=3, CX=1, DX=0

  73.         movw        %si, %ax        # mbr0
  74.         subw        0x0E(%bx), %ax        /* real sectors per track */
  75.         jbe        boot_error        /* installation problem? */
  76.         cmpw        $63, %ax
  77.         ja        boot_error        /* installation problem? */

  78.         movw        %ax, 0x18(%bp)        /* update sectors per track! */

  79.         /* print real sectors per track */
  80.         call        print_hex        # BX changed

  81.         /* read C/H/S=1/0/1 to 0000:7E00 */
  82.         shlw        $1, %ax                /* AX=interim sectors per cylinder */
  83.         lesw        -6(%bp), %bx        /* ES:BX=0000:7E00 */
  84.         //movw        $1, %cx                /* read 1 sector */
  85.         call        readDisk        # AX=5, CX=1, DX=0

  86.         movw        %si, %ax        # mbr0
  87.         subw        0x0E(%bx), %ax        /* real sectors per cylinder */
  88.         jbe        boot_error        /* installation problem? */

  89.         /* DX=0 */
  90.         divw        0x18(%bp)        /* rem=DX, should be 0 */
  91.                                 /* quo=AX, number of heads */

  92.         /* if DX != 0, stop! */
  93.         testw        %dx, %dx
  94.         jnz        boot_error        /* installation problem? */

  95.         movw        %ax, 0x1A(%bp)        /* update number of heads! */

  96.         /* print real number of heads */
  97.         call        print_hex        # BX changed

  98.         testb        %ah, %ah
  99.         jnz        boot_error        /* installation problem? */

  100. geometry_OK:

  101.         /* read GRLDR to 0000:7E00 */
  102.         /* calculate grldr starting sector number */
  103.         /* grldr serial number = (0x21 + 126 + 255*63 - 190) */
  104.         movw        %si, %ax        # mbr0
  105.         subw        $(0x21 + 126 + (255*63) - 190), %ax
  106.         lesw        -6(%bp), %bx        /* ES:BX=0000:7E00 */
  107.         movw        $1152, %cx        /* read 576K grldr */
  108.         call        readDisk        /* CX=1152, DX=0 */

  109. #if 0
  110.         /* We can do it later in the second stage. */
  111.         movb        0x40(%bp), %dl
  112.         movb        $0xFF, %dh
  113.         pushw        %dx
  114. #endif

  115.         //ljmp        $0, $0x7E00
  116.         pushw        %ds                /* DS=0 */
  117.         pushw        %bx                /* BX=0x7E00 */
  118.         lret

  119. int13_retry:
  120.         movw        $3, %di                /* try 3 times on failure */
  121. 2:
  122.         pushaw
  123.         call        int13
  124.         popaw
  125.         jc        1f
  126.         ret
  127. 1:
  128.         pushaw
  129.         cbw                        /* AH=0, reset disk */
  130.         call        int13
  131.         popaw
  132.         decw        %di
  133.         jnz        2b

  134. disk_error:
  135.         //movw        $0xDEAD, %ax
  136.         movw        $0xACCE, %ax        # disk access error
  137. boot_error:
  138.         call        print_hex        # BX changed
  139. 2:
  140.         jmp        2b

  141. /* Read sectors from disk, using LBA or CHS
  142. * input:        AX    = 16-bit LBA sector number
  143. *                CX    = number of sectors to read
  144. *                AX + CX <= 0x8000
  145. *                ES:BX = destination buffer
  146. *                SS    = DS
  147. *                BP-0x02 -> function call number for AX
  148. *                BP+0x18 -> sectors per track
  149. *                BP+0x1A -> number of heads
  150. *                BP+0x40 -> drive number
  151. *
  152. * output:        No return on error
  153. *                BX not changed
  154. *                CX not changed
  155. *                ES    = ES + 0x20 * CX
  156. *                AX    = AX + CX
  157. *                DX    = 0
  158. *                ZF    = 0
  159. *                CF    = 0
  160. */

  161. readDisk:
  162.         cwd                        /* DX=0 */
  163. 2:
  164.         pushaw
  165.         pushw        %dx                /* 0 */
  166.         pushw        %dx                /* 0 */
  167.         pushw        %dx                /* 0 */
  168.         pushw        %ax                /* lo 16bit of sector number */
  169.         pushw        %es                /* buffer segment */
  170.         pushw        %bx                /* buffer offset */
  171.         pushw        $1                /* 1 sector to read */
  172.         pushw        $16                /* size of this parameter block */

  173.         cmpb        $0x42, -1(%bp)        /* LBA supported */
  174.         je        1f                /* LBA mode */

  175.         /* CHS mode */
  176.         divw        0x18(%bp)        /* rem=DX */
  177.                                 /* quo=AX */
  178.                                 /* DH=0 */
  179.         incw        %dx                /* DL=sector number */
  180.         xchgw        %dx, %cx        /* CH=0, CL=sector number */

  181.         cwd                        /* DX=0 */
  182.         divw        0x1A(%bp)        /* rem=DX */
  183.                                 /* quo=AX, cylinder number */
  184.                                 /* DH=0, DL=head number */

  185.         xchgb        %dl, %dh        /* DL=0, DH=head number */
  186.         xchgb        %al, %ch        /* AL=0, CH=lo 8bit cylinder */
  187. #if 1
  188.         shrw        $2, %ax                /* hi 2bit cylinder ... */
  189.         orb        %al, %cl        /* ... should be in CL */
  190.         testb        %ah, %ah
  191. #else
  192.         /* equivalently, this should also work. */
  193.         rolw        $6, %ax                /* hi 2bit cylinder in AH */
  194.         orb        %ah, %cl        /* put into CL */
  195.         testb        %al, %al
  196. #endif
  197.         jnz        boot_error        /* cylinder overflow */
  198. 1:
  199.         movw        -2(%bp), %ax        /* (E)BIOS read 1 sector */
  200.         movw        %sp, %si        /* DS:SI points to disk address packet */
  201.         //movb        0x40(%bp), %dl        /* drive number */
  202.         pushw        %es
  203.         call        int13_retry
  204.         popw        %bx
  205.         //jc        disk_error
  206.         leaw        0x20(%bx), %bx
  207.         movw        %bx, %es
  208.         popaw                        /* remove parameter block from stack */
  209.         popaw
  210.         incw         %ax                /* next sector, here ZF=0 */
  211.         loop        2b
  212.         ret

  213. //        . = . - (. - readDisk)/68


  214. int13:
  215.         pushw        %ds
  216.         pushw        %es
  217. //        pushw        %bx        /* int13/ah=41h use BX, so do not save. */
  218. //        pushw        %dx        /* drive number already saved in memory. */
  219.         pushw        %si
  220.         pushw        %di
  221.         pushw        %bp
  222.         stc
  223.         movb        0x40(%bp), %dl        /* drive number */
  224.         int        $0x13
  225.         sti
  226.         popw        %bp
  227.         popw        %di
  228.         popw        %si
  229. //        popw        %dx
  230. //        popw        %bx
  231.         popw        %es
  232.         popw        %ds
  233.         ret

  234. print_hex:
  235.         # input                AX = value to print
  236.         #                DI = video text offset
  237.         #
  238.         # output        ES = 0xB800
  239.         #                DF = 0
  240.         #                DI = changed
  241.         #                BX = changed
  242.         pushw        $0xB800
  243.         popw        %es                # text mode video memory

  244.         cld
  245.         pushw        %ax
  246.         pushw        %cx
  247.         pushw        %bx
  248.         movw        $4, %cx
  249.         xchgw        %ax, %bx
  250. 2:
  251.         rolw        $4, %bx
  252.         movw        %bx, %ax
  253.         andb        $0x0F, %al
  254.         cmpb        $10, %al
  255.         jb        1f
  256.         addb        $7, %al
  257. 1:
  258.         addb        $0x30, %al
  259.         movb        $0x9F, %ah        # back/fore ground=bright blue/white
  260.         stosw
  261.         loop        2b
  262.         movw        $0x2F20, %ax        # back/fore ground=green/bright white
  263.         stosw
  264.         popw        %bx
  265.         popw        %cx
  266.         popw        %ax
  267.         ret
复制代码
回复

使用道具 举报

49#
发表于 2013-12-27 23:45:04 | 只看该作者
感谢不点,辛苦了,非常期待!
回复

使用道具 举报

50#
发表于 2013-12-28 15:09:31 | 只看该作者
只能精神上表示支持了, 一无技术,二无能力,三无条件,三无人员呵呵。当然有的是些许的兴趣和些许的时间,但愿能早点见到公测的成品,一定好好试用
回复

使用道具 举报

51#
 楼主| 发表于 2013-12-29 05:49:58 | 只看该作者
这是第一个测试版,主要目的是测试第一扇区代码是否有毛病。

注意,如果测试成功,屏幕的顶部会显示一些 16 进制的数字。最后一个数字如果是 ACED,则表示测试 OK。

请下载附件,并解压,生成 8M 的映像文件。这个文件是用来克隆到 U 盘的。

请使用 dd 以及类似的克隆软件进行操作。

严重警告!请确保不要写入你的本地硬盘!如果你不懂,请放弃操作!
如果误操作导致硬盘分区丢失,则无法恢复。请谨慎!每一步都要小心!


把 8M.mbr 文件按照扇区写入 U 盘的最开头,覆盖掉 U 盘原来的 MBR 以及分区表。这当然就破坏了 U 盘原有的数据。所以,请选择一个废弃了的 U 盘来操作,比如说,这个 U 盘的容量比较小,这样的 “废盘” 正好可以用来测试。

注意,这个 8M.mbr 自己含有分区表以及 BPB,请原封不动克隆到你的废弃了的 U 盘上。克隆之后,不要在 Windows 下查看 U 盘内容,因为现阶段还没有安排数据分区。另外也担心 Windows 会写入数据破坏已经建立的扇区结构,所以,克隆以后,不要在资源管理器中查看 U 盘的状况。克隆完了之后,你可以拔掉 U 盘,然后插到某个电脑上进行重启测试。

建议先在虚拟机上测试,消除安全隐患。

8M.rar

47.43 KB, 下载次数: 32, 下载积分: 无忧币 -2

试试看,这是第一个测试版。小心哦!别毁了你的硬盘!

回复

使用道具 举报

52#
发表于 2013-12-29 09:00:49 | 只看该作者
本帖最后由 cchessbd 于 2013-12-29 09:02 编辑

关于ud的文件列表,我希望默认采用ANSI格式,而不是UTF-8。
因为用jianliulian的fbinstool回写fba到u盘时,老是采用UTF-8的文件列表。
这样在我接触的两台电脑出错。
不能载入dos启动镜像及pe,居然把2.88m的识别为2000多m了,pe直接没反应。

郁闷了一段时间,因为这个。

其实说这个只是希望不点大师能做好这个。

点评

更换下你的fbinst版本,可以用fbinst修正版,也可以用不才的 fbinst plus。  详情 回复 发表于 2014-1-3 12:42
cchessbd兄久违,你所用fbinsttool版本可能太旧。 用新版重新强格u盘,重新制作fba应可解决问题。 最新版在ansi、utf-8方面未见问题报告。  详情 回复 发表于 2013-12-30 22:47
fbinst 核心代码读取文件件列表本身并不区分ansi或者utf-8,它是根据beyte对比,只有grldr或者查看文件列表才有编码之分。你启动不了应该是其他问题,为什么不提供详细的信息让大家帮你分析,说不定会发现新的bug或  详情 回复 发表于 2013-12-30 18:22
ANSI编码有缺陷,你在 Windows 下新建一个空白文本文档,用记事本打开,然后输入“联通”两个字,保存并关闭,然后再打开看看(Windows 默认以 ANSI 编码保存),ANSI 无法实现国际化 ,Unicode 代替 ANSI 是趋势。  发表于 2013-12-29 10:23
回复

使用道具 举报

53#
 楼主| 发表于 2013-12-29 21:18:26 | 只看该作者
本帖最后由 不点 于 2013-12-29 21:37 编辑

报告一个消息,我的 U 盘测试失败了,根本就死机一个,屏幕上任何信息都没有,应该是没能接到控制权。它要是成功了,那就没劲了。失败了正好有活干,可以折腾了。希望通过折腾,让秘密透露得更多一点。

而原来的 fbinst 当然是能够成功启动的。


它死了,可以用 ctrl+alt+del 重启,重启后机器仍然不正常,会死机。死机时,在有些时候,拔掉 U 盘就可以继续启动。

拔掉 U 盘可以继续走,从这个现象,也可分析,BIOS 没有把控制权传过来,而是 BIOS 自己在 “死读” U 盘。

接下来再做一个试验,让 8M 的扇区全都带有引导代码,这次看看能否接管控制。估计依旧不会接管控制的。

可能性最大的,那就是 BPB 表以及分区表的影响了。


回复

使用道具 举报

54#
发表于 2013-12-29 22:58:54 | 只看该作者
不点大人早点休息保重身体
有活干时慢慢折腾
就像章回小说,且听下回分解
回复

使用道具 举报

55#
发表于 2013-12-30 15:47:55 | 只看该作者
关注一下。就像P大所说的,保重身体,*下回分解。顺便说下,P大文字功底不错哦。
回复

使用道具 举报

56#
发表于 2013-12-30 18:22:23 | 只看该作者
cchessbd 发表于 2013-12-29 09:00
关于ud的文件列表,我希望默认采用ANSI格式,而不是UTF-8。
因为用jianliulian的fbinstool回写fba到u盘时 ...

fbinst 核心代码读取文件件列表本身并不区分ansi或者utf-8,它是根据beyte对比,只有grldr或者查看文件列表才有编码之分。你启动不了应该是其他问题,为什么不提供详细的信息让大家帮你分析,说不定会发现新的bug或者是你自己pe的问题

点评

很有道理,可能不是fbinst的bug,而是grldr或memdisk的bug。 ud用fbinst强制格式化时选择备份好的fba(备份时fba为ansi菜单),fb菜单由grldr 还有memdisk来引导启动文件。 不过grldr(2013.07.24/2013.11.30都试了  详情 回复 发表于 2013-12-31 12:59
回复

使用道具 举报

57#
发表于 2013-12-30 22:47:20 | 只看该作者
cchessbd 发表于 2013-12-29 09:00
关于ud的文件列表,我希望默认采用ANSI格式,而不是UTF-8。
因为用jianliulian的fbinstool回写fba到u盘时 ...

cchessbd兄久违,你所用fbinsttool版本可能太旧。
用新版重新强格u盘,重新制作fba应可解决问题。
最新版在ansi、utf-8方面未见问题报告。

点评

多谢p大也来关注,看来我抓到个小的bug,下次有机会上传个图片看看。 但是我要回家确认下,以免出错。 fbinsttool版是1.73m大小,世界末日版本。  详情 回复 发表于 2013-12-31 12:53
回复

使用道具 举报

58#
 楼主| 发表于 2013-12-30 22:52:46 | 只看该作者
章回小说,来个插曲。

今天 Windows 资源管理器要把我的 U 盘格式化。我同意了。用的是 FAT32 格式。完了之后,重启,我想看看微软的代码可否启动成功。结果,无论如何都是死机。反复插拔、反复折腾,达 10 次之多,都是死机,无任何信息显示。这个情况与我的代码很相似(即前面所提到的失败的测试结果)。

确信微软的代码已经不是 U 盘启动的标准了。而 fbinst 无论是用 FAT16 还是 FAT32,都能成功启动。

回复

使用道具 举报

59#
发表于 2013-12-31 08:24:56 来自手机 | 只看该作者
怎么看不到大家测试回馈?只有不点大师自己在测试吗?有时间测试,只是不了解原理,看不懂代码。菜啊。建议大师把每次测试包放在顶楼,日期标号,以便大家测试。
回复

使用道具 举报

60#
发表于 2013-12-31 12:53:24 | 只看该作者
本帖最后由 cchessbd 于 2013-12-31 13:18 编辑


pseudo 发表于 2013-12-30 22:47

cchessbd兄久违,你所用fbinsttool版本可能太旧。
用新版重新强格u盘,重新制作fba应可解决问题。
最新 ...


多谢p大也来关注,看来我抓到个小的bug,下次有机会上传个图片看看。

但是我要回家确认下,以免出错。

fbinstool版是1.73m大小,世界末日版本。

fbinstool强制格式化时,文件列表不是fba原来格式.rar

454.88 KB, 下载次数: 25, 下载积分: 无忧币 -2

操作录像

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-26 03:03

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表