/* Under glibc some of the constants involved have gotten symbolic names RB_*, and the library call is a 1-argument wrapper around the 3-argument system call: */ #include <unistd.h> #include <sys/reboot.h> int reboot(int cmd);至於參數的 "cmd",就是以 RB_ 開頭巨集表示的數值,可為以下:
/* For libc4 and libc5 the library call and the system call are identical, and since kernel version 2.1.30 there are symbolic names LINUX_REBOOT_* for the constants and a fourth argument to the call: */ #include <unistd.h> #include <linux/reboot.h> int reboot(int magic, int magic2, int cmd, void *arg);看到參數的 magic 與 magic2 字樣,很自然就會想到,就是 magic number,並且背後大有文章。在資訊技術的領域中,不乏會有透過有限空間,表達獨特趣味的手法,比方說 Microsoft COM 技術裡頭,不時會有蹦蹦跳跳的貓咪,證據就是 "MEOW packet",據某個權威者的說法 MEOW 代表 "Microsoft Extensible Object Wire" 之意,但不免啟人疑竇。又,從 Oak (橡樹) 更名為 Java 的知名程式語言,其 classfile 開頭就是 Cafe Babe (表示法為 0xCAFEBABE,亦即「咖啡寶貝」),這一類的案例更是豐富,凡十六進位表示法恰好能對應到英文某些詞彙者,就稱為 [Hexspeak]。Linux kernel 內自然也有,而且不只一處,本文的主題 reboot() 就堪稱其中經典。
$ printf "%x\n" 672274793 28121969稍微作切割,就是 28/12/1969,也就是 Linus Torvalds 生日的 DD/MM/YYYY 寫法。也可以這樣解讀:
$ perl -e 'print localtime(672274793). "\n";' Mon Apr 22 06:59:53 1991透過 localtime 得知筆者在 GMT+0800 (台北時區) 的日期表示,這個 1991 年四月 22 日大致是 Linus Torvalds 當年在芬蘭赫爾辛基大學撰寫 Linux Kernel 的日期。令人拍案叫絕之處,還不只如此,咱們繼續看下一個 LINUX_REBOOT_MAGIC2A = 85072278:
$ printf "%x\n" 85072278 5121996同樣的手法,得知日期是 1996 年十二月 5 日,這天是 Linus 千金 Patricia Miranda Torvalds 出生的日子,也被稱為 "Linus v2.0",同理可推論下個數值 LINUX_REBOOT_MAGIC2B = 369367448:
$ printf "%x\n" 369367448 16041998日期 1998 年四月 16 日,也就是二千金 Daniela Yolanda Torvalds,或 "Linus 3.0" 誕生的日子,當時甚至有網友異想天開問說「Linus 3.0 是否支援 IPv6 」或「Linus 是否 GPL 自己 的 DNA 序列」等令人莞爾的問句,女兒出生隔日則推出 Linux 2.1.97。
$ printf "%x\n" 537993216 20112000小女兒 Celeste Amanda Torvalds 誕生於 2000 年十一月 20 日,陪伴著服務於幼稚園的夫人,一家五口,應該頗熱鬧。看來沈迷電腦技術的高人,不僅軟體生產力強大,真實世界也不遑多讓。該不會過一段時間,又追加一個 magic number 呢? *笑*
#include <sys/syscall.h> #include <sys/reboot.h> #define __NR__reboot __NR_reboot static inline _syscall3(int, _reboot, int, magic, int, magic2, int, flag); int reboot(int flag) { return (_reboot((int) 0xfee1dead, 672274793, flag)); }reboot() 系統呼叫要能呼叫,其成立條件除了前述的 magic 與 magic2 要符合外,系統得有 SYS_BOOT capability (參見 include/linux/capability.h 標頭檔) 以及 BKL (Big Kernel Lock,就最新的發展來說,已逐漸移去 BKL)。除了字面上 "reboot" 的「重新啟動」意思,事實上,這個系統呼叫 (核心實做名稱為 "sys_reboot") 提供以下功能選項:
# echo 1 > /proc/sys/kernel/sysrq強制重新開機 (也叫做 fast reboot) 就給予以下指令:
# echo b > /proc/sysrq-trigger至於強制關機,就是以下:
echo o > /proc/sysrq-trigger由 jserv 發表於 August 3, 2008 07:27 AM
这个也应该算是彩蛋吧!呵呵!
由 xiaosuo 發表於 August 3, 2008 08:26 AM多虧了 Linus 爸爸,在全世界採納 Linux 核心設備都(幾乎)留下了她們存在的證明~XD..
由 魏藥 發表於 August 3, 2008 12:55 PM這真是有趣的彩蛋,沒有GUI,原來也是可以放入有趣的東西~_~
由 魔法設計師 發表於 August 4, 2008 12:42 AM經過您的一番解說之後我現在終於了解某些magic number是怎麼來的了 :-)
之前完全沒有想過要用hex拆解這些magic number!