linux system call

本文详细解析了Linux内核中的重启与关机系统调用实现机制,包括参数验证、权限检查及不同命令的处理流程。通过具体代码展示了如何根据不同指令执行重启、关机等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1 SYSCALL_DEFINE4(reboot,
  2                 int ,magic1,
  3                 int, magic2,
  4                 unsigned int ,cmd
  5                 void _user *,ang)
  6 {
  7         if(!capable(CAP_SYS_BOOT))
  8                 return -EPERM
  9         if(magic1 != LINUX_REBOOTMAGIC1 ||
 10            (magic2 != LINUX_REBOOT_MAGIC2&&
 11                 magic2 != LINUX_REBOOT_MAGIC2A &&
 12                 magic2 != LINUX_REBOOT_MAGIC2B &&
 13                 magic2 != LINUX_REBOOT_MAGIC2C ))
 14                 return -EINVAL;
 15         if((cmd == LIUX_REBOOT_CMD_POWEROFF)&&!pm_power_off)
 16                 cmd = LINUX_REBOOT_CMD_HALT;
 17
 18         lock_kernel();
 19         switch(cmd){
 20         case LINUX_REBOOT_CMD_RESTART:
 21                 kernel_restart(NULL);
 22                 break;
 23         case LINUX_CMD_CAD_ON:
 24                 C_A_D = 1;
 25                 break;
 26         case LINUX_CMD_CAD_OFF:
 27                 C_A_D = 0;
 28                 break;
 29         case LINUX_REBOOT_CMD_HALT:
 30                 kernel_halt();
 31                 unlock_kernel();
 32                 do_exit(0);
 33                 break;
 34         case LINUX_REBOOT_POWER_OFF:
 35                 kernel_halt();
 36                 unlock_kernel();
 37                 do_exit(0);
 38                 break;
 39         case LINUX_REBOOT_RESTART:
 40                 if(strcpy_from_user(&buffer[0],arg,sizeof(buffer)-1)<0){
 41                         unlock_kernel();
 42                         return -EFAULT;
 43                 }
 44                 buffer[sizeof(buffer)-1]='\0';
 45
 46                 kernel_restart(buffer);
 47                 break;
 48
 49         default:
 50                 unlock_kernel();
 51                 return -EFAULT;
 52         }
 53         unlock_kernel();
 54         return 0;
 55 }



在没有你的世界里,爱你叶铮


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值