在阅读Linux源代码(更具体地说是系统调用代码)时,我遇到了sys_reboot
实现:http : //lxr.free-electrons.com/source/kernel/reboot.c#L199。
199 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
200 void __user *, arg)
201 {
202 ...
...
286 }
在中间,有一段特定的代码:
209
210 /* For safety, we require "magic" arguments. */
211 if (magic1 != LINUX_REBOOT_MAGIC1 ||
212 (magic2 != LINUX_REBOOT_MAGIC2 &&
213 magic2 != LINUX_REBOOT_MAGIC2A &&
214 magic2 != LINUX_REBOOT_MAGIC2B &&
215 magic2 != LINUX_REBOOT_MAGIC2C))
216 return -EINVAL;
我想知道它实际上提供了什么样的“安全”。我的意思是,这是为了防止滥用?在这种情况下,由于参数是公共的,因此即使要求它们传递参数,任何库或应用程序都可能滥用系统调用。我错过了什么?
它可能是由于例如内存损坏或在系统调用号中输入错误而导致的意外调用。不知道这是否真的值得担心。
—
derobert
@derobert很有道理,但是...不是所有的系统调用都需要这样的保护吗?
—
lgeorget 2014年
getpid
当然,除了此类之类的东西,如果滥用它们都会产生不可预测的后果。也许,所有其他syscall已经具有足够的参数可以检查,以确保如果错误调用它们,它们就不会受到伤害。对我来说,这感觉像是一个“安全”的奇怪主意……
确实。我不确定Linus是否在某个时候追赶一个一直保持#$&#的错误!重新启动他的计算机,或者是否有人因为偏执狂而刚刚添加了计算机等等。为什么需要对此加以保护是个好问题。
—
derobert
@derobert可能是过去使用集成电路的人的遗留物,在集成电路中,许多芯片实施某种防护以启用关闭功能(例如,必须在关闭指令起作用之前将XYZ位写入特殊的寄存器)。不确定这样做的时间表是否合理,
—
mbrig