The Linux Programming Interface在第3章中进行了如下练习:
手册页告诉我们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编号的grep。我认为定义必须隐藏在某些宏技巧之后,因此我查看了System.map
下的/boot
文件,并在ctrl_alt_del
旁边找到了它。然后,我为该符号而烦恼,这使我找到了正确的文件。如果我是从源代码编译内核的,则可以尝试找到定义该符号的目标文件,然后从那里去。
最佳答案
只是一个猜测,但这些数字看起来更有趣(十六进制):
672274793 = 0x28121969
85072278 = 0x05121996
369367448 = 0x16041998
537993216 = 0x20112000
开发者或 child 的生日?
关于查找syscall实现,我做了一个
git grep -n LINUX_REBOOT_MAGIC2
并在kernel/sys.c中找到了定义。我怀疑符号sys_reboot
是由SYSCALL_DEFINE4(reboot, ...
gubbins生成的。关于linux - Linux reboot()系统调用的魔数(Magic Number),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4808748/