[关闭]
@Aklis 2016-10-24T11:42:41.000000Z 字数 1083 阅读 503

Sys.c中的具体实现

未分类


陈品维 14051409

  1. SYSCALL_DEFINE0(mycall)
  2. {
  3. printk("cpw is Here!\n");
  4. return 0;
  5. }
  6. SYSCALL_DEFINE3(mysetnice, int, pid, int, flag, int, nicevalue)
  7. {
  8. // set_one_prio
  9. // set_user_nice
  10. struct task_struct *g, *p;
  11. struct user_struct *user;
  12. const struct cred *cred = current_cred();
  13. long niceval, retval = -ESRCH;
  14. struct pid *pgrp;
  15. kuid_t uid;
  16. // set
  17. int error = -EINVAL;
  18. niceval = (long)nicevalue;
  19. // hook
  20. int which = PRIO_PROCESS;
  21. int who = pid;
  22. printk("Aklis's SysCall!\n");
  23. if (which > PRIO_USER || which < PRIO_PROCESS)
  24. return -EINVAL;
  25. error = -ESRCH;
  26. if (flag == 1) {
  27. if (niceval < MIN_NICE)
  28. niceval = MIN_NICE;
  29. if (niceval > MAX_NICE)
  30. niceval = MAX_NICE;
  31. }
  32. rcu_read_lock(); // 上锁
  33. read_lock(&tasklist_lock); // 上锁
  34. if (flag == 1) {
  35. switch (which) {
  36. case PRIO_PROCESS:
  37. if (who)
  38. p = find_task_by_vpid(who);
  39. else
  40. p = current;
  41. if (p)
  42. error = set_one_prio(p, niceval, error);
  43. break;
  44. }
  45. read_unlock(&tasklist_lock); // 解锁
  46. rcu_read_unlock();
  47. return error;
  48. }else if (flag == 0){
  49. printk("Aklis want to get the nice!\n");
  50. switch (which) {
  51. case PRIO_PROCESS:
  52. if (who)
  53. p = find_task_by_vpid(who);
  54. else
  55. p = current;
  56. if (p) {
  57. niceval = (task_nice(p));
  58. if (niceval >= MIN_NICE)
  59. retval = niceval;
  60. }
  61. break;
  62. }
  63. }
  64. read_unlock(&tasklist_lock); // 解锁
  65. rcu_read_unlock();
  66. return retval;
  67. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注