2012-06-18 2 views
8

현재 PID가 변경 될 때마다 (즉, 새 프로세스가 전환 될 때마다) 일부 진단 코드가 실행되도록 Linux 커널을 변경하려고합니다 (호기심이있는 경우 자세한 설명이 아래에 나와 있습니다). 나는 약간 파고 들었고, 스케쥴러가 새로운 프로세스를 선택할 때마다 함수 context_switch()이 호출되었다. 이것은 의미가있다. (이것은 단지 sched.c/schedule()의 간단한 분석에서 나온 것임).커널/sched.c/context_switch()는 프로세스가 전환 될 때마다 호출되도록 보장됩니까?

문제는 Linux 스케쥴러가 기본적으로 나에게 마법의 마법이된다는 것입니다. 그래서 전제가 맞는지 알고 싶습니다. 새로운 프로세스가 CPU에서 시간을 갖기 위해 선택 될 때마다 context_switch() 함수가 호출됩니다. 아니면 다른 상황에서 스케줄링을 처리 할 수있는 커널 소스의 다른 장소가 있습니까? (아니면이 모든 것을 완전히 오해하고 있습니까?)

MARSS x86 시뮬레이터를 사용하여 특정 프로그램의 계측 및 측정을 시도하고 있습니다. 문제는 데이터를 잘못 해석하는 것을 피하기 위해 특정 계측기가 특정 코드 이벤트가 실행되는 프로세스를 파악해야한다는 것입니다. 아이디어는 MARSS에 내장 된 메시지 전달 시스템을 사용하여 모든 컨텍스트 전환에 대해 새 프로세스의 PID를 전달하므로 현재 실행중인 PID를 항상 알고 있습니다. 누구나 쉽게 달성 할 수있는 간단한 방법을 생각할 수 있다면 크게 도움이 될 것입니다.

답변

4

예. 올바른 것입니다.

schedule()은 새 프로세스가 schedule()에 의해 선택되었을 때 한 작업에서 다른 작업으로 전환 할 책임이있는 context_switch()을 호출합니다.

context_switch() 기본적으로 두 가지가 있습니다. 전화 번호는 switch_mm()switch_to()입니다.

switch_mm() - 새로운 프로세스에 대한 가상 메모리 매핑 스위치

switch_to() -

을 (정보 및 기타 아키텍처 특정 일을 스택, 레지스터를 저장/복원) 새로운 프로세스에 이전 과정에서 프로세서 상태를 전환

귀하의 접근 방식에 관해서는, 괜찮습니다. 커널 작업을 할 때 친절하고 깨끗한 상태로 유지하는 것이 중요합니다. 더 많은 지식을 얻을 때까지 비교적 쉽게 유지하려고합니다.

관련 문제