lge*_*get 12 linux system-calls reboot
当我阅读 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 }
Run Code Online (Sandbox Code Playgroud)
在中间,有一段特定的代码:
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;
Run Code Online (Sandbox Code Playgroud)
我想知道它实际上提供了什么样的“安全”。我的意思是,是为了防止滥用吗?在这种情况下,由于参数是公开的,任何库或应用程序都可能滥用系统调用,即使它们需要传递参数。我错过了什么?
hru*_*ing 10
这个问题已经在这个超级用户问题中得到了回答:
基本上,地址中的位翻转会导致程序认为它正在调用一个系统调用,而实际上它正在调用reboot()系统调用。因为这reboot()是一个非常具有破坏性的非同步操作,它会擦除系统的状态——从而擦除位翻转问题的证据,否则这些问题会暴露为程序错误或恐慌——Linux 包括对其成功使用的额外保护.
有趣的是,第二组神奇数字对应于 Linus 和他三个女儿的生日: