深入理解系统调用

1.找一个系统调用,系统调用号为学号最后2位相同的系统调用

 

学号后两位为46,选择146号系统调用

 

 系统调用为__x64_sys_sched_get_priority_max

 

2.通过汇编指令触发该系统调用

 

sys_sched_get_priority_max系统调用为传入一个进程的调度策略,返回传入的调度策略的最大实时优先级的值,若进程为实时进程,则其优先级的值为1-99,返回最大则为返回99,若不为实时进程,则返回0。

先用C语言进行测试:

深入理解系统调用_第1张图片

 

 其中SCHED_OTHER为非实时进程调度策略,SCHED_FIFO为先入先出的实时进程调度策略,SCHED_RR为时间片的实时进程调度策略。

输出:

 

 从输出可以看出,SCHED_OTHER,SCHED_FIFO,SCHED_RR的宏定义分别为0,1,2,非实时进程调度策略的SCHED_OTHER,返回值为0,其余两个实时进程调度策略返回值为最大值99。

用一行c语言代码进行测试:

深入理解系统调用_第2张图片

使用gcc -S,得到汇编代码:

 

得到的对应的汇编代码为将SCHED_RR所对应的立即数2给edi作为参数,用call命令调用sched_get_priority_max。

静态编译后进行反汇编,得到:

 

 对应的__sched_get_priority_max为

深入理解系统调用_第3张图片

 

 可以看出将系统调用号0x92传给eax,之后执行指令syscall

 

3.通过gdb跟踪该系统调用的内核处理过程

 

 在__x64_sys_sched_get_priority_max处设置断点。

 深入理解系统调用_第4张图片

 

 执行到__x64_sys_sched_get_priority_max处停止,可以看到其在kernel/sched/core.c中定义。

 

4.重点阅读分析系统调用入口的保存现场、恢复现场和系统调用返回,以及重点关注系统调用过程中内核堆栈状态的变化

深入理解系统调用_第5张图片

 

 从代码中可以看出,传入参数为policy,也就是调度策略,ret为返回值,初值为-EINVAL,为无效参数的宏定义,之后定义了swich语句,如果policy调度策略取SCHED_FIFO或SCHED_RR,则将ret变为MAX_USER_RT_PRIO-1,退出swich语句,MAX_USER_RT_PRIO为宏,为实时进程最大优先级。

深入理解系统调用_第6张图片

 

 在sched文件的prio.h中定义了MAX_USER_RT_PRIO为100,则当policy为SCHED_FIFO或SCHED_RR时,ret变为99,最终返回值为99,如果policy为SCHED_DEADLINE,SCHED_NORMAL,SCHED_BATCH,SCHED_IDLE,则ret变为0,最终返回0。

你可能感兴趣的:(深入理解系统调用)