Linux reboot()系统调用的幻数


74

Linux编程接口在第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。我只为rep sys_reboot,而忘记了magic编号的grep。我认为定义必须隐藏在一些宏技巧的后面,因此我查看了下面的System.map文件/boot,并在旁边找到了该文件ctrl_alt_del。然后我为该符号摸索了一下,这使我找到了正确的文件。如果我是从源代码编译内核的,则可以尝试找到定义该符号的目标文件,然后从那里去。

Answers:


95

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

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

开发者或孩子的生日?

关于查找syscall实现,我做了一个git grep -n LINUX_REBOOT_MAGIC2发现,并在kernel / sys.c中找到了定义。我怀疑这个符号sys_reboot是由小SYSCALL_DEFINE4(reboot, ...企鹅产生的。


29
1969年12月28日是Linus Torvalds的生日[维基百科]。其他人似乎是他孩子的生日,尽管我只能确认一个人是1996年12月出生的(随机谷歌搜索)。
埃里克·塞帕潘

29
确认,这是莱纳斯和他的三个女儿的生日。-> nndb.com/people/444/000022378
录制

但是我的问题是:为什么这个系统调用需要魔术?我的猜测是避免在意外和意外调用后重新启动。即:系统调用在继续之前要做的第一件事就是验证所需的魔法是否存在……
lano1106 '02

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.