문제

Intel 소프트웨어 개발자 매뉴얼에는 인터럽트 벡터 32-255가 일반적으로 외부 IO 장치에 대해 사용자 정의된다고 나와 있습니다.내 시스템 프로그래밍 수업에서는 간단한 장치 드라이버를 개발해야 합니다.내 질문은 특정 장치에 사용할 특정 인터럽트 벡터를 어떻게 정의할 수 있습니까?BIOS로 이 작업이 수행됩니까?

메모:우리는 간단한 운영 체제를 개발 중이므로 상황이 매우 구체적이지만 결국 x86 시스템에서 이 모든 일이 어떻게 발생하는지 이해해야 합니다.현재 우리 시스템은 32 이상의 몇 가지 인터럽트 벡터가 직렬 포트 및 키보드와 같은 장치에 할당되도록 설정되어 있습니다.Intel 82801EB ICH5 IO 컨트롤러의 데이터시트, 특히 8259 PIC 관련 섹션을 읽으면 IRQ15가 보조 IDE 채널이라고 나와 있습니다.결국 스택에 인터럽트 벡터로 어떻게 배치됩니까?

너무 혼란스러워서 이 질문이 이해가 안 될 수도 있으니 미리 사과드립니다.

편집하다:따라서 우리의 시스템 프로그래밍 클래스에는 주어진 벡터 번호에 따라 특정 인터럽트를 처리하기 위해 ISR을 설치하기 위한 커널 루틴이 있는 매우 간단한 OS가 있습니다.지난 분기 우리 수업에서 교수님은 키보드를 벡터 번호 0x2c 또는 이와 유사한 것으로 정의하는 헤더 파일을 우리에게 주셨습니다.커널 루틴을 사용하여 기본 및/또는 보조 IDE 채널 인터럽트를 다양한 ISR에 매핑하는 방법을 찾으려고 합니다.현재 사용되지 않는 모든 인터럽트 벡터에는 인터럽트가 발생하면 메시지를 인쇄하는 기본 핸들러가 있으므로 IDE 인터럽트는 현재 켜져 있지도 않습니다. 그러나 이는 또 다른 질문입니다.

도움이 되었습니까?

해결책 5

글쎄, 나는 우리의 지원 코드, 특히 PIC 초기화 루틴에서 답을 찾은 것 같습니다. 다음 코드를 사용하면 IRQ 라인이 각각 마스터 및 슬레이브 사진의 IDT에서 오프셋 20h 및 28h에 매핑됩니다.

/* ICW2: master offset of 20 in the IDT, slave offset of 28 */

__outb( PIC_MASTER_IMR_PORT, 0x20 );
__outb( PIC_SLAVE_IMR_PORT, 0x28 );

이는 키보드가 벡터 번호 2C에 매핑되었고 1 차 및 보조 채널은 각각 2E 및 2F에 매핑 될 것임을 의미합니다. 여러분 중 일부는 아마도 질문을 더 잘 요청했다면 더 나은 답변을 줄 수 있었지만 어쨌든 도움에 감사드립니다!

82801EB ICH5 데이터 시트의 표 45는 8259의 IRQ 라인에 대해 자세히 설명하고 내 OS에서 마스터는 간단히 오프셋 20 시간에로드되고 슬레이브는 28H입니다.

감사!

다른 팁

특정 장치 IRQ를 매핑하기 위해 PIC (프로그래밍 가능한 인터럽트 컨트롤러)를 프로그래밍 할 수 있습니다.

x86에는 Daisy-Chained를 제공하는 두 개의 그림이 있습니다. IRQ0-7은 8259와 IRQ8-15에 의해 두 번째 8259에 의해 관리됩니다. 첫 번째는 CPU를 신호하며 마스터이며, 두 번째 (슬레이브)는 첫 번째 신호를 보냅니다.

IDT (인터럽트 디스크립터 테이블)는 인터럽트를 ISR의 주소 (인터럽트 서비스 루틴)에 매핑합니다. INT 명령 (소프트웨어 트랩)으로 인터럽트를 직접 올릴 수 있습니다.

예를 들어 인터럽트 0x80을 높이려면 실행하십시오 INT 0x80.

0x80을 처리하려면 mov [0x80*4], int_80_handler. 32 비트 아키텍처를 가정하면 주소 int_80_handler 기능은 이제 IDT의 0x80'th 위치에 저장됩니다.

도움이 될 것입니다.
http://en.wikipedia.org/wiki/intel_8259
http://en.wikipedia.org/wiki/interrupt_handler
http://en.wikipedia.org/wiki/interrupt
http://en.wikipedia.org/wiki/interrupt_descriptor_table

내가이 물건을 다루기 때문에 오랜 시간이 지났으므로 이것은 꺼져있을 수 있습니다. PC 인터럽트 컨트롤러에는 15 개의 IRQ 라인이 있음을 기억합니다. 이 맵은 인접한 X86 인터럽트 벡터에 대한 맵입니다. 따라서 주변 장치가 IRQ 라인을 트리거 할 때 PIC는 CPU를 방해하고 해당 INT 명령어가 실행되는 것처럼 어떤 벡터를 점프할지 알려줍니다. 일부 IRQ는 특정 주변 장치로 하드 코딩되지만 PCI 장치는 IRQ 및 기타 리소스 (레거시 ISA PNP 장치와 마찬가지로)의 OS와 협상한다고 생각합니다.

나는 당신이 의미하는 바를 이해하지 못합니다.

장치가 인터럽트를 받는 방법에는 두 가지가 있습니다.

  1. 플러그 앤 플레이 또는 Pci 메커니즘을 사용하십시오.그렇게 하면 BIOS가 주변 장치를 호출하고 리소스 요구 사항을 묻습니다.그런 다음 드라이버는 플러그 앤 플레이 장치를 열거하고, 지원되는 장치를 검색하고, 장치에서 하드웨어 인터럽트를 가져올 수 있습니다.

  2. 초기에는 어떻게 이루어졌습니까?하나의 인터럽트를 사용하십시오.사용자가 다양한 인터럽트 중에서 선택할 수 있도록 장치에 딥 스위치를 추가합니다.이제 자원 할당은 사용자의 손에 달려 있습니다.사용자는 또한 로드 시 어떻게든 드라이버에 인터럽트 번호를 전달합니다.

이제 인터럽트를 연결하는 방법은 다음과 같습니다.이는 OS와 x86이 실행되는 모드에 따라 다릅니다.순수 베어본 시스템의 경우 특수 명령어를 통해 IDT(Interrupt Descriptor Table)를 쿼리할 수 있습니다.해당 IDT가 있으면 주소를 가져와 IRQ 처리기의 주소를 올바른 슬롯에 넣을 수 있습니다.리얼 모드의 경우 더 이상 어떻게 수행되는지 모르겠습니다.

약간의 실시간 OS나 OS와 유사한 것이 실행되고 있다면 어려운 작업을 수행하는 커널 기능이 이미 있을 가능성이 높습니다.

기억 하듯이 메모리 공간의 시작 부분에는 특정 인터럽트가 발생할 때 호출하는 일상을 가리키는 벡터 테이블이 있습니다. 여기에서 너무 낮은 A 레벨에서 타격을 입을 수 있지만 (Old X86 어셈블리 프로그래머) 기본 레벨에서 해당 테이블에 벡터를 설치하면 루틴이 호출됩니다. 나는 내 오래된 참조 자료가 없으므로 실제 전화를 줄 수는 없지만 공식 방법이 BIOS 외부에서 작동한다면 놀랄 것입니다.

요즘 Guis에서 나는 인터럽트 공유와 모든 좋은 것들을 허용하는 다른 더 적절한 방법이 있다고 확신합니다.

편집 : 그다지 무시하십시오. 방금 하드웨어 인터럽트 외부에있는 인터럽트 16 이상을보고있는 것을 보았습니다. 나는 그 공간에 흥미로운 하드웨어 비트가 있기 전에 그 수준의 프로그래밍에서 멀어 졌기 때문에 처음 15 개의 IRQ 만 다루었습니다 (16 번째는 컨트롤러 사이의 계단식). 나는 다른 사람에게 관심이있는 경우를 대비하여 그것을 떠난다 :)

int 21h / ah = 25H- 세트 인터럽트 벡터; 입력 : al = 인터럽트 번호. DS : DX-> 새로운 인터럽트 핸들러.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top