|  | 
回复 #717 zhaohj 的帖子
| 程序很复杂,错误在里面,但只有硬件工程师才能定位。复制代码000923FF FA                             cli
00092400 1E                             pushw   %ds
00092401 06                             pushw   %es
00092402 0F A0                          pushw   %fs
00092404 0F A8                          pushw   %gs
00092406 66 60                          pushal
00092408 2E 8E 1E DA 4D                 movw    %cs:0x4DDA, %ds # DS=0x89C0
0009240D 83 3E C8 38 FF                 cmpw    $0xFFFF, 0x38C8 # [8D4C8]=000A
00092412 74 4A                          jz      0x0009245E
00092414 C7 06 22 00 00 00              movw    $0, 0x0022
0009241A C7 06 24 00 01 00              movw    $1, 0x0024
00092420 1E                             push    %ds
00092421 68 22 00                       push    $0x0022
00092424 6A 14                          push    $0x14
00092426 C4 1E A8 38                    les     0x38A8, %bx # ES:BX=9D3B:0070
0009242A 26 FF 5F 10                    lcall   *%es:0x10(%bx)
........................................此处还要 call far 9D3B:0080,就比较麻烦了。那又是一段很长的程序。
........................................估计错误就在那里面。
0009242E 83 C4 06                       add     $0x06, %sp
00092431 83 F8 00                       cmp     $0x00, %ax
00092434 75 08                          jnz     0x0009243E
00092436 A1 24 00                       movw    0x00000024, %ax
00092439 83 F8 00                       cmp     $0x00, %ax
0009243C 74 02                          jz      0x00092440
0009243E EB 1E                          ljmp    0x0009245E
00092440 A1 C8 38                       movw    0x000038C8, %ax
00092443 8A D0                          mov     %al, %dl
00092445 B0 20                          mov     $0x20, %al
00092447 80 FA 08                       cmp     $0x08, %dl
0009244A 72 04                          jc      0x00092450
0009244C BA A0 00                       mov     $0x00A0, %dx
0009244F EE                             out     %al, %dx
00092450 BA 20 00                       mov     $0x0020, %dx
00092453 EE                             out     %al, %dx
00092454 66 61                          popal
00092456 90                             nop
00092457 0F A9                          pop     %gs
00092459 0F A1                          pop     %fs
0009245B 07                             pop     %es
0009245C 1F                             pop     %ds
0009245D CF                             iret
0009245E 2E 83 3E DE 4D 00              cmpw    $0, %cs:0x4DDE
00092464 74 26                          jz      0x0009248C
00092466 FB                             sti
................................................# 此处的 pushf ; call far 就对应于访问磁盘的情况。
00092467 9C                             pushf
00092468 2E FF 1E DC 4D                 lcall   *%cs:0x4DDC
0009246D BA 21 00                       movw    $0x21, %dx
00092470 8B 1E                          movw    0x38C8, %bx
00092472 C8 38 80 FB 08                 cmp     $8, %bl
00092477 72 03                          jb      0009247C
00092479 BA A1 00                       mov     $0x00A1, %dx
0009247C 8A 1E 1A 00                    movb    0x001A, %bl
00092480 EC                             in      %dx, %al
00092481 F6 D3                          not     %bl
00092483 84 C3                          test    %al, %bl
00092485 74 05                          jz      0x0009248C
00092487 F6 D3                          not     %bl
00092489 22 C3                          and     %bl, %al
0009248B EE                             out     %al, %dx
0009248C EB C6                          ljmp    0x00092454
 这是中断共享的冲突问题。我估计硬件工程师忘了在 int13 的程序开头设置一个开关,用于通知 int72,让它执行硬盘的访问,所以,才出现这样的问题。
 
 总之,基本能够确定是 BIOS 的 bug,而不是故意制造的死机。
 
 =========
 
 顺便说,华硕的工程师很负责的,只要你报告,他们会解决的。这问题对于他们来说,其实是很小的,很容易就解决了。估计几个小时就能解决。
 
 
 
 好了,我们尽力了,无法解决。还是用我们自己的 workaround 吧,那既简单又管用。
 
 [ 本帖最后由 不点 于 2011-4-9 22:32 编辑 ]
 | 
 |