Linux重新引导系统调用中“魔术参数”的用途是什么?


10

在阅读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很有道理,但是...不是所有的系统调用都需要这样的保护吗?getpid当然,除了此类之类的东西,如果滥用它们都会产生不可预测的后果。也许,所有其他syscall已经具有足够的参数可以检查,以确保如果错误调用它们,它们就不会受到伤害。对我来说,这感觉像是一个“安全”的奇怪主意……
lgeorget 2014年

确实。我不确定Linus是否在某个时候追赶一个一直保持#$&#的错误!重新启动他的计算机,或者是否有人因为偏执狂而刚刚添加了计算机等等。为什么需要对此加以保护是个好问题。
derobert

@derobert可能是过去使用集成电路的人的遗留物,在集成电路中,许多芯片实施某种防护以启用关闭功能(例如,必须在关闭指令起作用之前将XYZ位写入特殊的寄存器)。不确定这样做的时间表是否合理,
mbrig

Answers:


10

此超级用户问题已回答此问题:

基本上,地址的一点翻转会导致程序在实际上正在调用系统调用时认为它正在调用一个reboot()系统调用。因为这reboot()是一种非常具有破坏性的非同步操作,它会擦除​​系统状态-从而消除了比特翻转问题的证据,否则该问题会由于程序错误或恐慌而暴露-Linux在成功使用时提供了额外的保护。

有趣的是,第二组魔术数字对应于Linus和他的三个女儿的生日:


1
啊,我没想到要验证其他站点。我从来没有想过这个问题可能会属于这里。无论如何,谢谢您的回答。:-)
lgeorget
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.