2012-05-01 3 views
2

내 보호 모드 운영 체제를 작성 중이며 인터럽트 테이블을 수정하여 특정 명령 (인쇄 문자열 등)이 명령 프롬프트 응용 프로그램이나 다른 응용 프로그램으로 리디렉션되도록하는 방법을 알아야합니다. 테이블을 어떻게 수정합니까?x86 인터럽트 테이블 수정

+2

http://wiki.osdev.org/IDT – ughoavgfhw

+1

OS 아키텍처 및 시스템 호출에 대한 모든 논의는 .. 음, 방대한 주제 일뿐입니다. '나는 명령 프롬프트가 찾을 수있는 특정 위치에 문자열과 물건을 넣을 것'을 의미한다 - 그렇게 쉽게 원격으로 밝혀지면 놀랄 것이다. 일반적으로 '다른 앱으로 리디렉션'하는 것은 '문자열 및 항목'이 OS 할당 구조체/객체로 이동하고 다른 프로세스의 스레드로 신호를 보내 게된다는 것을 의미합니다. 사용되는 메커니즘이 아키텍처에 따라 다르므로 매우 복잡하며 블로그로 설계 할 수 없습니다. –

답변

2

우선 시스템 호출에 인터럽트를 사용하는 것은 실제로 더 이상 구현하지 않는 "좋은"방법이 아닙니다. x64를 타깃으로한다면, SYSCALLSYSRET을 조사해야한다. 사용자의 관점에서 볼 때 커널 코드를 매우 편리하게 사용할 수있다. 단, 이들을 사용하는 데 필요한 몇 가지 설정 루틴을 다룰 의향이 있다면 두. 이것이 옵션이 아니라면, 커널 코드의 일부를 프로세스의 가상 메모리 공간에 매핑하는 것을 고려하십시오. Google은 linux-gate.so.1에 대해 그 구현 예를 읽습니다.

그러나 인터럽트를 통해 syscalls을 구현하려는 경우 계속 읽으십시오. 물론 하드웨어와 실제로 상호 작용하기 위해서는 어느 쪽이든 인터럽트 테이블을 수정해야 할 것입니다.

보호 모드의 x86에서 인터럽트는 IDT에 있으며 인터럽트 설명자 테이블의 줄임말입니다. 이 테이블은 Task Gate Descriptor, Interrupt Gate Descriptor 또는 Trap Gate Descriptor를 포함 할 수 있습니다. 테이블은 리얼 모드 인터럽트 벡터 테이블과 유사한 방식으로 인덱싱된다. 테이블의 n 번째 항목에는 인터럽트를 처리하는 데 사용되는 설명자가 포함됩니다. n. 인터럽트 및 트랩 게이트는 실제로 여분의 데이터가있는 인터럽트 루틴 코드의 포인터 일 뿐이지 만 태스크 게이트에는 해당 인터럽트를 처리 할 태스크의 선택자인 태스크 상태 세그먼트 선택기가 있습니다. 64 비트 모드에서는 하드웨어 작업 처리가 더 이상 사용되지 않으므로 인터럽트/트랩 게이트 만 지원됩니다.

나는이 문제를 매우 명확하게 설명하는 인텔 매뉴얼을 다시 말하면서 그 요점을 실제로 볼 수 없으므로, 이제 have a read (비록 지금은 그러한 매뉴얼이 있어야 함)을 제안합니다. 인터럽트 처리는이 문서의 6 장에 설명되어 있습니다.