Linux重启()系统调用的魔术数字
Linux编程接口在第3章中有一个练习:
当使用Linux特有的reboot()系统调用来重启系统时,第二个参数magic2必须被指定为一组幻数(例如,LINUX_REBOOT_MAGIC2)。 这些数字的意义是什么? (将它们转换为hex提供了一个线索。)
手册页告诉我们magic2
可以是LINUX_REBOOT_MAGIC2(672274793),LINUX_REBOOT_MAGIC2A(85072278),LINUX_REBOOT_MAGIC2B(369367448)或LINUX_REBOOT_MAGIC2C(537993216)之一。 我没有用hex解释他们的意思。 我也看了/usr/include/linux/reboot.h
,也没有给出任何有用的评论。
然后我在内核的源代码中search了sys_reboot
的定义。 我发现的只是一个头文件中的声明。
所以,我的第一个问题是,这些数字的意义是什么? 我的第二个问题是, sys_reboot
的定义在哪里,你是怎么find它的?
编辑 :我发现kernel/sys.c
的定义。 我只grepped为sys_reboot
,忘了grep的MAGIC号码。 我觉得这个定义必须隐藏在一些macros观把戏后面,所以我查看了/boot
下的System.map
文件,并在ctrl_alt_del
旁边find了它。 然后,我为那个符号擦了擦,这导致了我正确的文件。 如果我从源代码编译内核,我可以尝试find哪个目标文件定义了符号,然后从那里开始。
只是一个猜测,但这些数字看起来更有趣的hex:
672274793 = 0x28121969 85072278 = 0x05121996 369367448 = 0x16041998 537993216 = 0x20112000
开发者或开发者的孩子的生日?
关于查找系统调用实现,我做了一个git grep -n LINUX_REBOOT_MAGIC2
并在kernel / sys.c中find了这个定义。 符号sys_reboot
是由SYSCALL_DEFINE4(reboot, ...
gubbins,我怀疑生成。
这是Linus Torvalds(Linux内核和Git版本控制的开发者)和他的三个女儿的生日。 作为神奇的数字重新启动系统。