2014-02-17 1 views
0

을 사용할 때 필요한 많은 키보드 컨트롤러 대기 호출되며, A20을 가능하게하기위한 코드들 바와 같이 다음에는 A20 선에 <a href="http://wiki.osdev.org/A20_Line#Enabling" rel="nofollow">OSDev page</a>부터 A20 게이트

enable_A20: 
    cli 

    call a20wait 
    mov  al,0xAD 
    out  0x64,al 

    call a20wait 
    mov  al,0xD0 
    out  0x64,al 

    call a20wait2 
    in  al,0x60 
    push eax 

    call a20wait 
    mov  al,0xD1 
    out  0x64,al 

    call a20wait 
    pop  eax 
    or  al,2 
    out  0x60,al 

    call a20wait 
    mov  al,0xAE 
    out  0x64,al 

    call a20wait 
    sti 
    ret 

a20wait: 
    in  al,0x64 
    test al,2 
    jnz  a20wait 
    ret 


a20wait2: 
    in  al,0x64 
    test al,1 
    jz  a20wait2 
    ret 

a20wait 입력 버퍼에서 대기하고 a20wait2 출력 버퍼.

내가 이해 한 바로는 0x64에서 쓰기/읽기는 버퍼 레지스터가 아닌 명령/상태 레지스터에 액세스합니다.

그런데 입/출력 버퍼에서 너무 많은 대기가 발생하는 이유는 무엇입니까? 상태 레지스터를 읽기 전에 출력 버퍼에 하나가 있어야하고 새로운 명령 바이트를 기록한 후 입력 버퍼에 하나가 있어야합니까?

이전 단락에서 언급 한 두 가지 대기 호출을 제외하고 다른 모든 대기 호출을 사용하지 않으려 고 시도했지만 정상적으로 작동했습니다. 그러나 나는 그들이 왜 거기에 있는지 궁금해. 다른 이유가 있습니까?

+0

a20wait 함수는 입력 버퍼 상태 비트가 지워졌는지 테스트합니다. 이는 입력 된 값이 포트 0x60 또는 0x64에 기록되기 전에 필요합니다. 자세한 내용은 http://wiki.osdev.org/%228042%22_PS/2_Controller#Status_Register를 참조하십시오. –

+0

또한 여기서는 운영 체제 개발에 대한 몇 가지 질문을 던졌습니다. http://forum.osdev.org/index.php에서 계정을 등록하는 것이 좋습니다. 실제로 읽은 모든 자습서는 해당 커뮤니티의 사람들이 작성하기 때문에. 당신이 아마 거기에 물어 보면 더 적은 시간에 더 상세한 대답을 얻을 수있을 것입니다. –

답변

3

A20 게이트 제어 신호는 다른 프로세서에서 제공됩니다. 전통적으로 8042 마이크로 컨트롤러는 출력 포트 핀 중 하나가 신호를 구동합니다. 이 마이크로 컨트롤러는 키보드 인터페이스를 처리하기 위해 고안된 것이며 사용하지 않은 출력 핀을 가지고있어서 AT를 설계 한 IBM 엔지니어가 하드웨어 비용을 줄이고 A20 게이트 신호를 제어하기로 결정했습니다.

주 프로세서와 해당 마이크로 컨트롤러 간의 인터페이스는 매우 단순한 것으로 8 비트 포트 2 개만 있습니다. I/O 주소 0x60은 데이터 포트이고, 0x64는 명령/상태 포트입니다.

8042는 주 프로세서와 완전히 별개의 자체 프로그램을 실행합니다. 그래서 약간의주의가 필요하다. 핸드 쉐이킹은 소프트웨어로해야한다. 8042가 이전 명령을 획득하고 실행했음을 확인한 후에 만 ​​쓸 수 있습니다. 그리고 8042가 데이터 포트에 글을 쓴 것을 확인한 후에 만 ​​무언가를 읽으십시오. 따라서 입력 및 출력 버퍼 상태 비트에 대한 회전은 8042가 따라 잡아야합니다.

회전을 제거하면 에뮬레이터에서 작동 할 수 있습니다. 실제 하드웨어에서는 제대로 작동하지 않을 가능성이 높습니다. 위험에 완전히 빠질 필요가 없습니다.

+0

그러나 입력 또는 출력 버퍼를 포함하지 않는 0x64에 쓰거나 읽는 경우 왜 기다려야합니까? 나는 데이터 전송을 위해 대기가 필요하다는 것에 동의한다. – Cygnus

+0

명령도 같은 방식으로 작동합니다. –

관련 문제