The Linux Programming Interface在第 3 章中有一个练习是这样的:
When using the Linux-specific reboot() system call to reboot the system, the second argument, magic2, must be specified as one of a set of magic numbers (e.g., LINUX_REBOOT_MAGIC2). What is the significance of these numbers? (Converting them to hexadecimal provides a clue.)
手册页告诉我们 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
中找到了定义。我只 grep 了 sys_reboot
,忘记了 grep 的 MAGIC 数字。我认为定义必须隐藏在一些宏技巧后面,所以我查看了 /boot
下的 System.map
文件,发现它在 ctrl_alt_del旁边
。然后我用 grep 寻找那个符号,这让我找到了正确的文件。如果我从源代码编译内核,我可以尝试查找定义符号的目标文件,然后从那里开始。
最佳答案
只是猜测,但这些数字在十六进制中看起来更有趣:
672274793 = 0x28121969
85072278 = 0x05121996
369367448 = 0x16041998
537993216 = 0x20112000
开发者或开发者 child 的生日?
关于查找系统调用实现,我做了一个 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/