2010-06-13 3 views
0

Windows에서 KeSetSystemAffinityThread를 사용하여 드라이버 코드의 프로세서 선호도를 설정하고 KeGetCurrentProcessorNumber를 사용하여 내 코드가 실행중인 프로세서를 확인할 수 있습니다.Linux 커널 모듈에 대한 프로세서 선호도 설정은 무엇입니까?

나는 리눅스 커널 모듈에서 비슷한 것을하려고 노력하고있다. 그러나 내가 볼 수있는 선호도 호출은 userland 프로세스를위한 것이다. 특정 프로세서에서 어셈블리 코드를 실행할 수 있도록이 작업을 수행 할 수있는 방법이 있습니까? (즉 sgdt)

편집 :

나는이 현재 프로세서를 얻을 수 하는 방법을 알아 냈어요 생각합니다. smp_processor_id()가 제대로 작동하는 것처럼 보입니다.

답변

3

아마 커널을 수정해야 할 것 같지만 변경 사항이 너무 거친 것은 아닙니다. 그냥 모듈 sched.csched_setaffinity을 수출 :

long sched_setaffinity(pid_t pid, const struct cpumask *in_mask) 
    { 
    ... 
    } 
+ EXPORT_SYMBOL_GPL(sched_setaffinity); // Exported, now callable from your code. 
+0

필자는 이전에 이것을 보았지만 userland 프로세스에만 해당한다고 가정했지만 pid 인수를 0으로 설정하면 실제로 작동합니다. 필자는 함수 포인터를 사용하여 커널을 다시 컴파일하지 않고 /boot/System.map에서 sched_setaffinity를 찾아 테스트하지 않고 관리했습니다. long (* extern_sched_setaffinity) (pid_t pid, const struct cpumask * in_mask) = (void *) 0xffffffff81066a70; 내 시스템에. 감사합니다. –

+3

드라이버에 의해 특별히 생성 된 커널 스레드의 선호도를 설정하지 않는 한, 이것은 좋은 생각이 아닙니다. 그렇지 않으면 드라이버 코드가 다른 시간에 여러 프로세스의 컨텍스트에서 실행될 수 있습니다. 각 프로세스는 고유 한 * 스케줄러 선호도를가집니다. 다른 CPU로 바운스되지 않고 짧은 코드 부분 만 실행하려면'preempt_disable()'과'preempt_enable()'을 사용하여 선점 비가 중 임계 영역을 만들 수 있습니다. – caf

+0

@caf : 나는 "내 코드"라고 말했기 때문에 당신이 묘사 한 것이 사실이라고 생각했습니다. 그래도 좋은 충고. –

1

smp_processor_id()는 논리 프로세서 당신이 실행중인 당신에게 말할 것이다.

일부 아키텍처는 다른 프로세서에서 함수를 실행하기 위해 프로세서 간 인터럽트를 사용하는 smp_call_function_single 커널 함수도 지원합니다.

관련 문제