인터럽트를 처리하는 커널 모듈을 만들었습니다. 또한 C 프로그램이 있습니다.인터럽트가 처리 될 때까지 프로그램 실행을 일시 중지하십시오. 어떻게 수행 할 수 있습니까?
이 프로그램은 실행 중에 인터럽트를 발생시킵니다. 인터럽트가 발생하면 커널 모듈의 인터럽트 핸들러가이 인터럽트를 처리 할 때까지 프로그램을 일시 중단하고 정지 상태를 유지해야합니다.
어떻게 달성 할 수 있습니까?
인터럽트를 처리하는 커널 모듈을 만들었습니다. 또한 C 프로그램이 있습니다.인터럽트가 처리 될 때까지 프로그램 실행을 일시 중지하십시오. 어떻게 수행 할 수 있습니까?
이 프로그램은 실행 중에 인터럽트를 발생시킵니다. 인터럽트가 발생하면 커널 모듈의 인터럽트 핸들러가이 인터럽트를 처리 할 때까지 프로그램을 일시 중단하고 정지 상태를 유지해야합니다.
어떻게 달성 할 수 있습니까?
커널 모듈이 수행하는 동안 PTHREAD_PROCESS_SHARED
속성이 설정된 뮤텍스를 기다릴 수 있습니다. 커널 모듈이 완료되면 mutex에 신호를 보내 프로세스가 계속 진행될 수 있습니다.
는 뮤텍스으로 할당 할이 프로세스간에 공유 메모리에
당신이 있습니다
을 교부가 있어야합니다 :pthread_mutexattr_setpshared
를 사용할 수있는이 설정합니다. 그러한 에 대한 메모리는 동적으로 할당되어야하기 때문에 mutex는 mutex_init()를 사용하여 명시 적으로 초기화 된 이어야합니다.
This program causes interrupts during its execution
나는 사용자 공간 프로그램이 소프트 인터럽트/시스템 호출을하고 가정, 당신은 커널 시스템 호출 테이블을 편집하고 사용자 정의 시스템 호출의 수를 할당 및 재 컴파일로 커널을 설치 한 커스텀 시스템 콜/소프트 인터럽트. 인터럽트가 올 때
, 프로그램은 중단되어야하고, 숙박 일시 중단 - 커널 모듈의 인터럽트 핸들러가 마감이 인터럽트를 처리 할 때까지. 프로그램이 소프트 인터럽트를 호출 할 때이 들어
, 당신은, 당신의 IRQ를해야 프로그램이 다른 소프트 인터럽트를 호출하기 전에,이 방법은, 이전의 인터럽트가 이동에서 처리되었을 것입니다 원자 적으로 실행하는 일이 다른 우선 순위가 높은 인터럽트에 의해 선점되지 않습니다. 이 원 자성을 달성하기 위해 irq 핸들러에서 스핀 록을 사용할 수 있습니다.
예
spinlock_t mLock = SPIN_LOCK_UNLOCK;
unsigned long flags;
spin_lock_irqsave(&mLock, flags); // save the state, if locked already it is saved in flags
// IRQ Handler Code here
spin_unlock_irqsave(&mLock, flags); // return to the formally state specified in flags
,이 문제에 관해서 명명 된 뮤텍스의 간단한 예제를 제공 할 수주십시오? –
실제로 @JakeBadlands는 리눅스에서 mutex의 몇 가지 속성을 설정하여 proc을 공유 할 수 있도록해야하며 두 procs 모두에서 액세스 할 수있는 메모리에 있어야합니다. [Here] (http://stackoverflow.com/questions/9389730/is-it-possible-to-use-mutex-in-multiprocessing-case-on-linux-unix)는 좀 더 자세한 정보입니다. –