linux - Linux reboot() 系统调用的魔数(Magic Number)

标签 linux linux-kernel system-calls

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/

相关文章:

linux-kernel - open 对普通文件和设备驱动程序如何工作

c - opendir() 系统调用后指向 char 的指针发生变化

c++ - 使用经过检查的 STL 实现,有什么免费的吗?

php - 线上服务器的/usr/local/lib在哪里

java - 在 Java 中为非 root 用户绑定(bind) < 1024 的端口

linux-kernel - ioctl 负载类型/大小违规

linux - 在 bash 中从文件中读取并执行带空格的行

c - 两个不相关的进程如何知道相同的 key 来分配相同的共享内存

linux - 如果以64位代码使用32位int 0x80 Linux ABI,会发生什么情况?

c - 如何在 OS161 中添加 open 系统调用的两个变体?