|
回复 #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 编辑 ] |
|