x86 CPU에서 인터럽트, 특히 페이지 폴트의 제어 흐름을 처리하려고합니다. 지금까지 알아낼 수있는 것은 다음과 같습니다.x86에서 장치 메모리 복사본을 서비스하기 위해 페이지 폴트에 대한 인터럽트 처리
- IDT는 서비스 루틴 주소로 채워집니다.
- 인터럽트가 발생합니다.
- CPU는 EFLAGS, CS 및 EIP를 스택에 저장합니다.
- EIP가 IDT에서 가져온 ISR 주소로 설정됩니다. 즉,
mov eip, [idtr+interruptNum*4]
- 인터럽트 루틴이 실행됩니다.
- 인터럽트 루틴은
iret
명령으로 완료됩니다.
이제 인터럽트가 실제로 NIC 버퍼와 관련된 페이지 폴트라고 가정 해 봅시다. ISR이 out
을 사용하여 DMA 컨트롤러에 시스템 메모리에서 장치로 복사본을 보내도록 (또는 그 반대로) 말합니까? 아니면 그 반대입니까?
아니요, 페이지 오류 처리기는 처리하는 장치 드라이버와 매우 다릅니다 NIC. DMA는 페이지 폴트를 일으키지 않으며 페이징되지 않은 풀의 실제 메모리를 사용합니다. –
DMA가 페이지 폴트를 일으킨 것은 아닙니다. ISR이 DMA 컨트롤러가 메모리 블록을 시스템 메모리 (RAM)에서 장치로 복사하도록 지시했음을 의미합니다. 아마도 제 질문이 충분히 설명이되지 않았을 것입니다. – Polynomial
오, 잠깐, 이제 알 겠어. 따라서 인터럽트 처리기는 장치 드라이버에 신호를 보내는 데 사용되며 장치 드라이버는 장치와 통신하기 위해 필요한 모든 작업을 수행합니다. 이 경우 시그널링은 보통 어떻게 이루어 집니까? 나는 ISR이 매우 빠르게 실행될 것이라는 인상을 받고 있지만 장치 드라이버는 장치와 통신하기 위해 많은 작업을해야 할 수도 있습니다. 아니면 인터럽트 라인을 즉시 지워서 새로운 인터럽트를 처리 할 수 있습니까? – Polynomial