2010-08-14 4 views
5

어떻게 C에서 소프트웨어 인터럽트를 프로그래밍 할 수 있습니까? 인터럽트 서비스 루틴을 작성한 다음 루틴을 호출 할 수 있도록 CPU를 인터럽트해야하지만 C에서이를 수행하는 방법을 알지 못합니다. 또한 루틴을 인터럽트 설명자로 등록하는 방법을 모르겠습니다. 표. 저는 x86-64 CPU (AMD Turion64 X2)를 가지고 있고 gcc 컴파일러를 사용하고 있습니다. 도움이 될 것입니다.소프트웨어 인터럽트

+1

어떻게해야하는지 묻는 것은 응용 프로그램이 아니라 운영체제를 작성할 때하는 일입니다. 당신이하려는 것을 조금 더 설명해 주시겠습니까? –

+0

사실 저는 교수진 과제를 수행하고 있습니다. IRET 지침을 검토해야하므로 인터럽트 서비스 루틴이 필요합니다. 필자가 작성한 후에는 실행 파일의 16 진수 코드로 "재생"하고 IRET (삭제 또는 무언가)을 변경하여 어떤 일이 발생하는지 확인합니다. – protector

+3

ISR을 C로 작성할 수 없으므로 (일부) 어셈블리가 필요합니다. 보호 모드 운영 체제에서는 ISR을 테스트 할 수 없습니다. IRET를 변경하면 코드가 손상됩니다. 이 과제에 대해 교육 담당자와상의하십시오. –

답변

-1

sigaction을 사용하십시오. man 2 sigaction을 참조하십시오.

인터럽트를 발생 시키려면 raise 또는 kill을 사용하십시오.

+2

이것이 정확히 OP가 물어 보는 것 같지 않습니다. –

+0

이것은 일을하지 않으며 실제 방해를하지 않습니다. 내가 명확하지 않은 경우, 응용 프로그램이 아니라 CPU를 중단해야합니다. – protector

1

운영 체제는 응용 프로그램에서 실제 인터럽트를 숨 깁니다. 내가 아는 한 커널 계층 (링 0?)에서 실행하지 않는 한 불가능합니다.

3

인터럽트의 개념은 C 스펙에 포함되어 있지 않으며 일부 프로세서에만 해당됩니다. GCC를 포함한 대부분의 컴파일러를 사용하면 인라인 어셈블리 코드를 작성할 수 있습니다 (또는 어셈블리에 작성된 파일을 프로그램에 연결할 수도 있습니다). 그러나 가장 큰 문제는 일반적인 운영 체제 (특히 64 비트 모드로 실행되는 운영 체제)가 인터럽트 테이블을 변경하지 못하게한다는 것입니다. 최선의 방법은 간단한 오픈 소스 OS를 찾고 일반 프로그램 (OS가 허용하는 경우)에서 인터럽트 핸들러를 설치하거나 코드를 커널에 추가하는 것입니다. 프로세서 시뮬레이터 (또는 가상 머신)에서 작은 코드를 실행할 수없는 이유는 프로세서가 64 비트 모드로 들어가기 위해서는 상당한 설정이 필요하기 때문입니다. 인터럽트 테이블을 변경하는 방법에 대한 자세한 내용은 해당 설정에 따라 다릅니다.

0

ISR은 언어의 문제가 아닙니다. 그렇습니다. C로 할 수 있습니다.

OS 커널에 대한 이해, GIC 또는 다른 인터럽트 컨트롤러로 특정 인터럽트 라인에서 ISR을 등록하고 인터럽트 설명자 테이블에 항목을 작성하기 위해 호출되는 루틴 . Linux의 ARM과 비슷합니다. ISR을 IRQ 컨트롤러에 등록하고 IRQ_DESC 테이블에 항목을 만드는 request_irq()입니다.

먼저 각 OS의 ISR 프레임 워크를 확인하십시오.