首页 文章

Linux reboot()系统调用的幻数

提问于
浏览
56

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 的定义在哪里,你是如何找到它的?

EDIT :我在 kernel/sys.c 中找到了该定义 . 我只是为了 sys_reboot 而哭泣,忘记了寻找MAGIC号码 . 我认为定义必须隐藏在一些宏技巧背后,所以我查看 /boot 下的 System.map 文件,并在 ctrl_alt_del 旁边找到它 . 然后我 grab 那个符号,这导致我找到了正确的文件 . 如果我从源代码编译内核,我可以尝试找到定义符号的对象文件,并从那里开始 .

2 回答

  • 20

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

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

    开发人员或开发人员的孩子的生日?

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

  • 76

    这是Linus Torvalds(Linux内核的开发者和Git版本控件)和他的3个女儿的生日 . 作为魔术数字重新启动系统 .

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

相关问题