Linux restart() 系统调用的幻数

问题描述 投票:0回答:2

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
中找到了定义。我只 grep 查找
sys_reboot
,而忘记 grep 查找 MAGIC 数字。我认为这个定义一定隐藏在一些宏技巧后面,所以我查看了
System.map
下的
/boot
文件,并在
ctrl_alt_del
旁边找到了它。然后我查找该符号,这使我找到了正确的文件。如果我从源代码编译了内核,我可以尝试找到定义该符号的目标文件,然后从那里开始。

linux linux-kernel system-calls
2个回答
113
投票

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

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

开发者或开发者孩子的生日?

关于查找系统调用实现,我做了一个

git grep -n LINUX_REBOOT_MAGIC2
并在kernel/sys.c中找到了定义。我怀疑符号
sys_reboot
是由
SYSCALL_DEFINE4(reboot, ...
古宾斯生成的。


31
投票

今天是 Linus Torvalds(Linux 内核和 Git 版本控制的开发者)和他的 3 个女儿的生日。作为神奇数字来重新启动系统。

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

© www.soinside.com 2019 - 2024. All rights reserved.