我在两种情况下遇到过0x55AA:
0x55AA
。0x55AA
那么0x55AA
有什么特别之处?
0x55AA
的二进制版本为0101010110101010
。是因为它是0和1均匀交错?但我不认为这是一个强有力的标准。
答案 0 :(得分:1)
0x55AA是一个“签名词”。它在512字节引导记录的最后2个字节中用作“扇区结束”标记。这包括MBR及其扩展启动记录以及较新的GPT保护MBR。
参考文献:
答案 1 :(得分:0)
这种组合没有什么神奇或神秘的东西。实施者需要一种方法来确定设备的第一个扇区是否可引导(引导签名),并且在扇区的最后两个字节中发生的组合是如此不可能,这就是选择它的原因。
同样地,可以发现SMBIOS入口点扫描BIOS中的_SM_
签名必须在这样的段边界上;
Find_SMBIOS:
push ds
push bx ; Preserve essential
push si
; Establish DS:BX to point to base of BIOS code
mov ax, 0xf000
mov ds, ax ; Segment where table lives
xor bx, bx ; Initial pointer
mov eax, '_SM_' ; Scan buffer for this signature
; Loop has maximum of 4096 interations. As table is probably at top of buffer, cycling
; though it backwards saves time. In my test bed, BOCH's 2.6.5 BIOS-bochs-latest it was
; 1,451 interations.
.L0: sub bx, 16 ; Bump pointer to previous segment
jnz .J0
; Return NULL in AX and set CF. Either AX or flag can be tested on return.
mov ax, bx
stc
jmp .Done
; Did we find signature at this page
.J0: cmp [bx], eax
jnz .L0 ; NZ, keep looking
; Calculate checksum to verify position
mov cx, 15
mov ax, cx
mov si, bx ; DS:SI = Table entry point
; Compute checksum on next 15 bytes
.L1: lodsb
add ah, al
loop .L1
or ah, ah
jnz .L0 ; Invalid, try to find another occurence
; As entry point is page aligned, we can do this to determine segment.
shr bx, 4
mov ax, ds
add ax, bx
clc ; NC, found signature
.Done:
pop si
pop bx ; Restore essential
pop ds
ret
该签名在十六进制转储中很容易识别,并且适合16位寄存器。在这两个标准促成因素的情况下,我不知道,但同样,0x5f4d535f出现在偶数16字节边界的可能性非常小。