【问题标题】:Magic numbers of the Linux reboot() system callLinux reboot() 系统调用的幻数
【发布时间】:2011-06-16 01:50:23
【问题描述】:

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

【问题讨论】:

    标签: linux linux-kernel system-calls


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 1969 年 12 月 28 日是 Linus Torvalds 的出生日期 [维基百科]。其他的似乎是他孩子的出生日期,虽然我只能确认一个出生于 1996 年 12 月 [随机谷歌搜索]。
    • 已确认,这是 Linus 和他的 3 个女儿的出生日期。 -> nndb.com/people/444/000022378
    • 但我的问题是:为什么这个系统调用需要魔法?我的猜测是避免在意外和意外调用它后重新启动。即:系统调用在继续之前所做的第一件事是验证是否存在所需的魔法......
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-07
      • 2012-06-30
      • 1970-01-01
      • 2014-04-22
      • 2012-12-30
      • 2016-05-12
      • 2016-03-02
      • 1970-01-01
      相关资源
      最近更新 更多