Linux reboot()系统调用的幻数

时间:2011-01-26 19:02:42

标签: linux linux-kernel system-calls

The Linux Programming Interface在第3章中练习如下:

  

使用特定于Linux的reboot()时   系统调用重启系统,   第二个参数,magic2,必须是   指定为一组魔法之一   数字(例如,LINUX_REBOOT_MAGIC2)。   这些意义何在?   号码? (将它们转换为   十六进制提供线索。)

手册页告诉我们magic2可以是LINUX_REBOOT_MAGIC2(672274793),LINUX_REBOOT_MAGIC2A(85072278),LINUX_REBOOT_MAGIC2B(369367448)或LINUX_REBOOT_MAGIC2C(537993216)之一。我没能用十六进制解读它们的含义。我还查看了/usr/include/linux/reboot.h,它也没有给出任何有用的评论。

然后我在内核的源代码中搜索了sys_reboot的定义。我发现的只是头文件中的声明。

因此,我的第一个问题是,这些数字有什么意义?我的第二个问题是,sys_reboot的定义在哪里,你是如何找到它的?

编辑:我在kernel/sys.c中找到了该定义。我只对sys_reboot进行了抨击,并忘了grep寻找MAGIC数字。我认为定义必须隐藏在一些宏技巧背后,所以我查看System.map下的/boot文件,并在ctrl_alt_del旁边找到它。然后我抓住那个符号,这导致我找到了正确的文件。如果我从源代码编译了内核,我可以尝试找到哪个对象文件定义了符号,并从那里开始。

2 个答案:

答案 0 :(得分:81)

只是一个猜测,但这些数字在十六进制中看起来更有趣:

672274793 = 0x28121969
 85072278 = 0x05121996
369367448 = 0x16041998
537993216 = 0x20112000

开发人员或开发人员的孩子的生日?

关于查找系统调用实现,我做了git grep -n LINUX_REBOOT_MAGIC2并在kernel / sys.c中找到了定义。我怀疑,符号sys_reboot是由SYSCALL_DEFINE4(reboot, ... gubbins生成的。

答案 1 :(得分:21)

这是Linus Torvalds(Linux内核开发人员和Git版本控件)及其3个女儿的生日。作为魔术数字重新启动系统。

http://en.wikipedia.org/wiki/Linus_Torvalds