2017-03-04 2 views
2

어셈블리가 처음입니다. BIOS가 무엇을하는지 알아 내려고 할 때, gdb을 사용하여 추적합니다. 그러나, 나는 정말로 나에게 이상한 것을 발견했다.
코드 세그먼트는 이것이다 :BIOS가 다른 포트에서 두 번 동일한 행의 동일한 레지스터로 읽습니다.

[f000:d129] 0xfd129: mov eax,0x8f 
[f000:d12f] 0xfd12f: out 0x70,al 
[f000:d131] 0xfd131: in  al,0x71 
[f000:d133] 0xfd133: in  al,0x92 
[f000:d135] 0xfd135: or  al,0x2 
[f000:d137] 0xfd137: out 0x92,al 

내가 BIOS가 연속 포트 0x71 및 0x92에서 읽는 이유를 궁금해. 두 번째 명령은 포트 0x71에서 읽은 값을 포함합니까? 그러면 포트 0x71에서 읽는 이유는 무엇입니까?

감사합니다.

답변

4

IO 포트 0x70은 "CMOS/RTC 인덱스 레지스터"이며 IO 포트 0x71은 "CMOS/RTC 데이터 레지스터"입니다. CMOS에서 무언가에 액세스하려면 인덱스를 설정 한 다음 데이터 레지스터에 읽고 쓰십시오.

일부 RTC 칩의 경우 인덱스를 설정하고 데이터 레지스터를 읽거나 쓰지 않으면 칩은 정의되지 않은 상태로 남습니다. 즉, 나중을 위해 인덱스를 설정하려는 경우 데이터 레지스터에서 읽을 필요가 있으므로 현재와 나중의 "정의되지 않은 상태"를 피할 수 있습니다.

즉, 읽은 값은 중요하지 않습니다. 읽기는 부작용을 일으키며, 중요한 것은 부작용입니다.

+0

포트 0x70은 NMI를 비활성화/활성화하는데도 사용됩니다. 비트 7이 0이면 NMI가 활성화되고, 비트 7이 1이면 NMI가 비활성화됩니다. 따라서 코드는 NMI를 사용하지 않도록 설정 한 다음 제공 한 이유로 0x71 포트의 더미 읽기를 수행합니다. –

+0

@RossRidge : 마침내 무시 무시한 "무시 무시한 하드웨어 오류를 무시하고 용감하게 앞으로 알지 못하는"가능성을 잊어 버리는 데 몇 년이 걸렸습니다. 나는 지금 슬프다. ;-) – Brendan

+0

오 예. 마스크 할 수없는 인터럽트를 마스크하는 아이디어는 사악합니다. 우리는 다시 이것을 가져 오면 안됩니다. 한숨... –

2

포트 0x700x71CMOS registers입니다.

이 주제에서 발견 된 가장 좋은 목록 is from the BOCHS emulator. 다음
이 목록에 따르면, 코드 판독 :

mov eax,0x8f ; sets 'NMI disabled ' and 'CMOS RAM index' = 64 
out 0x70,al ; write 
in  al,0x71 ; any write to 0x70 should be followed by an action to 0x71 or the RTC wil be left in an unknown state. 
in  al,0x92 ; read PS/2 system control port A 
or  al,0x2  ; set BIT1 = indicates A20 active 
out 0x92,al ; write PS/2 system control port A 

그래서이 코드는 NMI 비활성화하고 A20 line 활성 상태로 설정한다. 마지막 세 줄은 Fast A20 Gate을 구현합니다. BIOS가 연속으로 포트 0x71 및 0x92에서 읽고 왜


이 궁금

이유는 단순히

any write to 0070 should be followed by an action to 0071 or the RTC will be left in an unknown state. 

은 그래서 첫 번째 읽기 (in al,0x71에 읽기)이다 이것을 보장하는 것 외에 다른 목적을 수행하지 못하므로 그 결과는 무시 될 수 있습니다.