操作系统-实验一
参考链接
内核源码的个人理解
进程调度API之set_user_nice
inux内核分析笔记----调度
进程优先级处理
权重计算
实验步骤
1.修改系统调用表
(linux-4.18/arch/x86/entry/syscalls/syscall_64.tbl)
335 64 mysetnice __x64_sys_mysetnice
//系统调用号 应用二进制接口 系统调用名 服务例程入口地址
2.申明系统调用服务例程原型
(linux-4.18/include/linux/syscalls.h)
asmlinkage long sys_mysetnice(pid_t pid,int flag,int nicevalue,void __user*prio,void __user*nice);
//asmlinkage是一个必须的限定词,用来通知编译器直接从堆栈中提取该函数的参数,而不是从寄存器中。在执行服务例程前,系统就已经把通过寄存器传递的参数压到内核堆栈里了。
3.实现系统调用服务例程
(linux-4.18/kernel/sys.c)
SYSCALL_DEFINE5(mysetnice,pid_t,pid,int,flag,int,nicevalue,void __user*,prio,void __user*,nice){
struct pid * kpid;
struct task_struct * task;
kpid = find_get_pid(pid); //通过进程pid号获取pid结构体
task = pid_task(kpid, PIDTYPE_PID); //通过皮的结构体得到相应的进程控制块
int n;
n