深入理解系统调用
1.找一个系统调用,系统调用号为学号最后2位相同的系统调用
学号后两位为46,选择146号系统调用
系统调用为__x64_sys_sched_get_priority_max
2.通过汇编指令触发该系统调用
sys_sched_get_priority_max系统调用为传入一个进程的调度策略,返回传入的调度策略的最大实时优先级的值,若进程为实时进程,则其优先级的值为1-99,返回最大则为返回99,若不为实时进程,则返回0。
先用C语言进行测试:
其中SCHED_OTHER为非实时进程调度策略,SCHED_FIFO为先入先出的实时进程调度策略,SCHED_RR为时间片的实时进程调度策略。
输出:
从输出可以看出,SCHED_OTHER,SCHED_FIFO,SCHED_RR的宏定义分别为0,1,2,非实时进程调度策略的SCHED_OTHER,返回值为0,其余两个实时进程调度策略返回值为最大值99。
用一行c语言代码进行测试:
使用gcc -S,得到汇编代码:
得到的对应的汇编代码为将SCHED_RR所对应的立即数2给edi作为参数,用call命令调用sched_get_priority_max。
静态编译后进行反汇编,得到:
对应的__sched_get_priority_max为
可以看出将系统调用号0x92传给eax,之后执行指令syscall
3.通过gdb跟踪该系统调用的内核处理过程
在__x64_sys_sched_get_priority_max处设置断点。
执行到__x64_sys_sched_get_priority_max处停止,可以看到其在kernel/sched/core.c中定义。
4.重点阅读分析系统调用入口的保存现场、恢复现场和系统调用返回,以及重点关注系统调用过程中内核堆栈状态的变化
从代码中可以看出,传入参数为policy,也就是调度策略,ret为返回值,初值为-EINVAL,为无效参数的宏定义,之后定义了swich语句,如果policy调度策略取SCHED_FIFO或SCHED_RR,则将ret变为MAX_USER_RT_PRIO-1,退出swich语句,MAX_USER_RT_PRIO为宏,为实时进程最大优先级。
在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。
posted on 2020-05-27 18:42 lc120798654 阅读(261) 评论(0) 编辑 收藏 举报