<그림1 home\ubuntu\v4.10\kernel\sched\sched.h>

 

모듈를 집어 넣었을 때 fair 스케쥴의 .next를 변경해줘야 되기 때문에 위 그림처럼 extern const struct sched_class fair_sched_class;의 문장에서 const를 빼주었다.

 

<그림2 home\ubuntu\v4.10\kernel\sched\fair.c>

그리고 위와 같은 이유로 fair.c에 있는 fair 스케쥴에 대한 선언부와 정의부도 const를 빼줌으로써 .next의 변경을 자유롭게 해주었다.

 

<그림3 home\ubuntu\v4.10\kernel\sched\core.c>

위 그림을 설명하자면 우선 struct sched_class* classpointer를 선언해주었는데 이 변수는 나중에 sched_setattr()시스템 호출을 하면서 현재 수행되어지는 스케줄러를 내가 만든 스케줄러로 변경해야 되는데 그 스케줄러는 모듈로 되어 있어 커널과 모듈을 연결해주는 매개 변수의 역할을 하게 된다. 자세한 설명은 뒤에서 기술할 것이다. 그 다음으로는 mysched_usage라는 int형 변수인데 이 변수는 모듈이 들어왔는지 안 들어왔는지를 판별해주는 변수로서 0일 때는 안들어왔고 1일 때는 들어왔음을 의미한다. 그리고 이 두변수와 위에 기술된 나머지 스케줄클래스 변수들을 EXPORT_SYMBOL해줌으로써 모듈에서 그 변수를 쓸 수 있게 하였다.

 

 

<그림4 home\ubuntu\v4.10\kernel\sched\mysched\mysched.c>

 

다음으로는 모듈코드이다. Init할 때 mysched_usage변수를 1로 바꿔 커널에 모듈이 들어 왔다는 것을 알리고 classpointer &my_sched_class를 넣어줌으로써 모듈에서 classpointer를 가지고 내가 만들 스케줄러를 활용 할 수 있게 되었다. 그 활용은 뒤에 기술할 것이다. 그리고 커널에서 EXPORT한 변수 fair_sched_class.next &my_sched_class로 해줘 결과적으로는 fair클래스와 idle클래스 사이에 내가 만든 클래스를 넣게 된 것이다. 마지막으로 exit함수에서는 이와 반대로 해서 모듈이 빠져나갈 때의 설정을 해주었다.

 

<그림5 \home\ubuntu\v4.10\kernel\sched\mysched\test.c>

 

위의 그림은 유저프로그램의 코드인 test.c인데 여기서 policySCHED_MYFIFO로 지정해주syscall(314,getpid(),&attr,0)를 호출하여 내 스케줄러를 사용하여 이 프로세를 실행시켜주는 것이다. 314sched_setattr() 시스템호출함수의 함수 번호이고 SCHED_MYFIFO는 내 스케줄러를 사용하겠다라고 지정해 줄려고 쓰는 상수인데 이 선언은 다음 나오는 그림6에 선어되어있다.

 

<그림6 home\ubuntu\v4.10\include\uapi\linux\sched.h>

저렇게 임의로 7로 선언해주었다.

 

마지막으로는 sched_setattr()함수를 호출하였으며 그 경로를 따라 코드를 바꿔주어 내 스케줄러에 프로세스가 잘 들어가 동작하는지를 확인하여야 한다. 일단 결론부터 말하자면 실패하였다. 그래도 내가 시도했던 것을 설명하려고 한다.

 

<그림7 home\ubuntu\v4.10\kernel\sched\sched.h>

 

일단 내 스케줄러는 validpolicy로 인식해주기 위하여 원래 커널코드의 형식에 맞춰myfifo_policy라는 함수를 만들어주어 valid_policy의 리턴값에 || 연산으로 추가하여 제대로 인식되게 만들어 주었다.

 

<그림8 home\ubuntu\v4.10\kernel\sched\core.c>

 

 

일단 syscalls.h를 보면 sched_setattr() 이 함수가 #define SYSCALL_DEFINE3라는 매크로함수로 되어 있는 것을 알 수 있다. 그래서 core.c에서 찾아본결과 SYSCALL_DEFINE3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param) 이런 함수를 발견 하였고 이 함수를 시점으로 하여 계속 따라간 결과 sched_setattr -> __sched_setscheduler -> __setscheduler -> __setscheduler_params 그리하여 위에 나오는 그림처럼 코드를 추가하였다. 우선 mysched_usage1이면 모듈이 들어왔다는 것이므로 이것과 policySCHED_MYFIFO가 되면 즉 내가 만든 스케줄러로 지정이 되면 p지금 수행하고 있는 작업의 sched_classclasspointer로 지정해주었다. Classpointer 아까 모듈에서 &my_sched_class로 지정해주었기 때문에 결론적으로 말하면 내가 만들 스케줄러로 바꿔준다는 뜻이다.

 

<그림9 insmod/rmmod mysched.ko>

 

하지만 위 그림과 같이 모듈이 들어갔다 나왔다는 잘 되었지만 ./test 프로그램을 실행하여도 dmesg에 내 스케줄러가 잘 동작하는지에 대한 결과가 출력되지 않았다.

 

 

깃허브

https://github.com/icd0422/Modifying-the-Linux-CPU-scheduling-structure

 

icd0422/Modifying-the-Linux-CPU-scheduling-structure

Contribute to icd0422/Modifying-the-Linux-CPU-scheduling-structure development by creating an account on GitHub.

github.com

 

+ Recent posts