因?yàn)?a target="_blank">LINUX操作系統(tǒng)的流行,Linus 已經(jīng)成為地球人都知道的名人。雖然大家可能都聽過錢鐘書先生的名言:“假如你吃個(gè)雞蛋覺得味道不錯(cuò),又何必認(rèn)識(shí)那個(gè)下蛋的母雞呢?” 但是如果真是遇到一個(gè)“特別顯赫”的雞蛋,很多人還是想看看能生出這顆神蛋的母雞的,或者想聽聽這只母雞的故事。
其實(shí),在Linux內(nèi)核的代碼里,就隱藏著關(guān)于Linus大神的一個(gè)美妙故事。
啟動(dòng)Linux系統(tǒng),Ctrl + Alt + T打開一個(gè)終端窗口,執(zhí)行如下命令,喚出GDB,并打開描述內(nèi)核空間的kcore虛擬文件。
$ sudo gdb --core /proc/kcore
然后在GDB中執(zhí)行如下命令加載內(nèi)核的符號(hào)信息:
(gdb)file /home/ge/work/linux-3.12.2/vmlinux
(gdb) set disassembly-flavor intel
接下來反匯編用于系統(tǒng)重啟的SYSC_reboot內(nèi)核函數(shù):
(gdb)disassemble SYSC_reboot
結(jié)果類似下圖所示。
對(duì)于看到匯編就暈的看官勿要急(^_^),其實(shí)x86匯編是非常簡(jiǎn)單易懂的,特別是這個(gè)函數(shù)很好理解,里面充滿著故事。另外,這可是地地道道Linus大神所寫的代碼啊。
在這個(gè)函數(shù)里有一串比較指令,有理且有趣。不妨先看這一句:
cmp DWORD PTR [ebp-0x114],0xfee1dead
這個(gè)常量很酷吧?Feel Dead。Linus大神是著名的語言大師,常常語出驚人,用非常簡(jiǎn)短的語言說出人間真善美,說出他人所不敢說。因?yàn)檫@個(gè)函數(shù)是用來重啟的,如果不feel dead,干嘛要重啟呢?
再往下看,會(huì)看到這樣一條比較指令:
cmp edi,0x28121969
這個(gè)常量是不也很特別,0x28121969,是不很像是日期,對(duì)的,這就是Linus大神的出生年月日,1969年12月28日。明年,Linus大神50歲了,時(shí)光如流水啊,當(dāng)年的毛頭小伙,就要50歲了。三十而立,四十不惑,五十而知天命。Linus大神顯然提前完成了“知天命”的目標(biāo)。他就是上天派下來革Windows的命的。(^_^)
再往下看,還有一個(gè)日期:
cmp edi,0x5121996
1996年12月5日,這個(gè)日期是什么呢?是Linus大女兒的生日。
把時(shí)光倒退回1993年,那時(shí)Linus還是24歲的棒小伙,應(yīng)該是大學(xué)畢業(yè)不久吧,當(dāng)時(shí)知道Linux的還不多。有一天,Linus親自授課,宣傳Linux的用法。課程結(jié)束時(shí),Linus留了一個(gè)課后測(cè)驗(yàn),要求參加者做好了以郵件形式交卷。結(jié)果,有一位上課的美女在交測(cè)驗(yàn)結(jié)果的同時(shí)向Linus發(fā)出了一個(gè)約會(huì)的邀請(qǐng),于是一場(chǎng)培訓(xùn)成就了一段美妙的姻緣,這個(gè)女生(Tove)成了Linus的太太。值得一提的是,Linus太太武功高強(qiáng),曾經(jīng)6次奪得芬蘭國(guó)家級(jí)別的跆拳道比賽冠軍。
1997年6月,第二屆亞特蘭大Linux展示會(huì)(Atalanta Linux Showcase,簡(jiǎn)稱ALS)在美國(guó)舉行,這是Linux發(fā)展早期的一個(gè)年度盛會(huì)。在周五晚上的感謝晚宴上,Linus全家出席,在會(huì)議的相冊(cè)中,可以看到幸福的一家人。
(照片來自http://linuxshowcase.org)
照片中,Tove深情地看著Linus。Linus抱著的就是他們的大女兒,名叫Patricia Torvalds。Linus把她稱作Linus v2.0。在位于母校網(wǎng)站的一個(gè)個(gè)人主頁上(https://www.cs.helsinki.fi/u/torvalds/),Linus放了幾張Patricia嬰兒時(shí)的照片,至今仍在,好久沒有更新了。從網(wǎng)頁上的信箱(torvalds@transmeta.com)來看,當(dāng)時(shí)Linus還沒有全職做Linux,還在Transmeta公司工作。
2015年8月,opensource.com特別采訪了已經(jīng)在讀大學(xué)的Patricia。
https://opensource.com/life/15/8/patricia-torvalds-interview
報(bào)道提到,Patricia熱愛計(jì)算機(jī)科學(xué),已經(jīng)在多個(gè)IT公司實(shí)習(xí),技術(shù)方面小有成就,大有子承父業(yè)的雄心壯志。
(照片來自opensource.com)
照片中站在中間便是Patricia,她旁邊的另兩個(gè)年輕女生是她的兩個(gè)妹妹,她們的生日也可以在上面的匯編代碼里找到:
cmp edi,0x16041998
cmp edi,0x20112000
一位是98年,一位是00后。
那么這些神秘的常量是如何用的呢?這要看一下reboot API的函數(shù)原型。
int reboot(int magic, int magic2, int cmd, void *arg);
在這個(gè)API的文檔中(man reboot(2)),可以看到關(guān)于上述常量的說明:
This system call will fail (with EINVAL) unless magic equals LINUX_REBOOT_MAGIC1 (that is, 0xfee1dead) and magic2 equals LINUX_REBOOT_MAGIC2 (that is, 672274793). However, since 2.1.17 also LINUX_REBOOT_MAGIC2A (that is, 85072278) and since 2.1.97 also
LINUX_REBOOT_MAGIC2B (that is, 369367448) and since 2.5.71 also LINUX_REBOOT_MAGIC2C (that is, 537993216) are permitted as value for magic2. (The hexadecimal values of these constants are meaningful.)
括號(hào)里的一句說這些常量的十六進(jìn)制是富有含義的,誠(chéng)然。
換句話來說,要想成功調(diào)用reboot API,那么前兩個(gè)參數(shù)必須嚴(yán)格按如下規(guī)則填寫:
第一個(gè)參數(shù)必須是0xfee1dead。
在Linus大神的大女兒Patricia出生之前,第二個(gè)參數(shù)能且只能是0x28121969,也就是大神的生日。
當(dāng)Linus有了大女兒Patricia后,第二個(gè)參數(shù)也可以是Patricia的生日0x5121996。這樣說有點(diǎn)不精確,精確的說法是從Linux內(nèi)核2.1.17版本開始,第二個(gè)參數(shù)也可以是0x5121996。查閱kernel.org上的內(nèi)核發(fā)布?xì)v史,2.1.17應(yīng)該發(fā)布于1996年12月22日。可以想見,Linus大神在喜得愛女的幾天內(nèi)就修改了內(nèi)核代碼,然后在女兒滿月之前把把這個(gè)代碼發(fā)布給世界了。
當(dāng)Linus有二女兒后,第二個(gè)參數(shù)也可以是二女兒的生日。
當(dāng)Linus有了小女兒后,第二個(gè)參數(shù)也可以是小女兒的生日。
在內(nèi)核代碼中,上述規(guī)則是在reboot.c中強(qiáng)制的,代碼如下:
/* For safety, we require "magic" arguments. */
if (magic1 != LINUX_REBOOT_MAGIC1 ||
(magic2 != LINUX_REBOOT_MAGIC2 &&
magic2 != LINUX_REBOOT_MAGIC2A &&
magic2 != LINUX_REBOOT_MAGIC2B &&
magic2 != LINUX_REBOOT_MAGIC2C))
return -EINVAL;
這個(gè)for safety,有點(diǎn)含糊啊!哈哈。
因?yàn)閼?yīng)用程序調(diào)用這個(gè)系統(tǒng)服務(wù)的時(shí)候必須使用這一系列常量,因?yàn)樗鼈兊亩x寫在uapi目錄下的reboot.h,即:
/*
* Magic values required to use _reboot() system call.
*/
#defineLINUX_REBOOT_MAGIC10xfee1dead
#defineLINUX_REBOOT_MAGIC2672274793
#defineLINUX_REBOOT_MAGIC2A85072278
#defineLINUX_REBOOT_MAGIC2B369367448
#defineLINUX_REBOOT_MAGIC2C537993216
注意啊,在這個(gè)文件和文檔中,代表生日的四個(gè)常量都是以十進(jìn)制表達(dá)的,應(yīng)該是為了隱藏一下秘密吧。
0:000> .formats 0n85072278
Evaluate expression:
Hex: 00000000`05121996
如此看來,Linus大神不僅把這些常量寫在Linux內(nèi)核代碼中,而且使它們成為L(zhǎng)inux API的一部分。這意味著,這將成為永遠(yuǎn)。只要Linux系統(tǒng)還在,那么這些常量就將永遠(yuǎn)使用,因?yàn)锳PI意味著用戶態(tài)和內(nèi)核態(tài)的法定接口。為了保障應(yīng)用程序的兼容性,不可輕易變化。
無論哪種文化,家庭都有著極其重要的地位。修身齊家治國(guó)平天下,欲治其國(guó)者,先齊其家。從上面的故事來看,Linus大神是個(gè)很愛家的男人。他把自己心愛的家庭成員生日銘記(雕刻)在了他的偉大作品之中。
那么,Linus大神為什么選擇reboot系統(tǒng)調(diào)用呢?reboot代表著新的開始,代表不拘泥于現(xiàn)狀,從新出發(fā),從頭再來。這是很多人都喜歡的人生哲學(xué)。在古老的易經(jīng)中,第63卦是既濟(jì),字面意思是渡河成功,代表成就了一個(gè)目標(biāo)。但這并不是終結(jié),最后一卦(第64卦)是未濟(jì),代表還有新的目標(biāo)沒有達(dá)到,需要繼續(xù)努力。
某種程度上來說,人生應(yīng)該在實(shí)現(xiàn)一個(gè)個(gè)“既濟(jì)”的成果之后,不斷地向著“未濟(jì)”的目標(biāo)進(jìn)軍。這也意味著人生要不斷學(xué)習(xí),用《荀子》一書開篇的話來說就是“學(xué)不可以已(停止)”。
這篇短文是帶著對(duì)Linus大神的敬意來寫的,希望大家受到鼓舞,學(xué)習(xí)Linus愛家愛代碼的敬業(yè)精神,不要誤以為老雷在褻瀆圣賢啊。
-
內(nèi)核
+關(guān)注
關(guān)注
4文章
1468瀏覽量
42880 -
Linux
+關(guān)注
關(guān)注
88文章
11760瀏覽量
219043 -
代碼
+關(guān)注
關(guān)注
30文章
4968瀏覽量
73988
原文標(biāo)題:雕刻在LINUX內(nèi)核中的LINUS故事
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Linux內(nèi)核編碼風(fēng)格權(quán)威總結(jié):從縮進(jìn)到底層設(shè)計(jì),讓你的代碼更“內(nèi)核味”
Linux內(nèi)核bug狩獵指南:從棧跟蹤到修復(fù),官方文檔教你搞定系統(tǒng)核心故障
Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?
深入RK3588內(nèi)核:rockchip_linux_defconfig的作用與調(diào)試價(jià)值
Linux系統(tǒng)內(nèi)核參數(shù)調(diào)優(yōu)實(shí)戰(zhàn)指南
【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核開發(fā)基礎(chǔ)
【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】+讀內(nèi)核處理的核心輔助函數(shù)
深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)
代碼里的青春——我與RT-Thread的故事
基于 DR1M90 的 Linux-RT 內(nèi)核開發(fā):從編譯配置到 GPIO / 按鍵應(yīng)用實(shí)現(xiàn)(1)
Linux內(nèi)核printk日志級(jí)別全解析:從參數(shù)解讀到實(shí)操配置
deepin亮相2025中國(guó)Linux內(nèi)核開發(fā)者大會(huì)
Linux內(nèi)核參數(shù)調(diào)優(yōu)方案
如何配置和驗(yàn)證Linux內(nèi)核參數(shù)
樹莓派4 性能大比拼:標(biāo)準(zhǔn)Linux與實(shí)時(shí)Linux 4.19內(nèi)核的延遲測(cè)試
Linux內(nèi)核的代碼隱藏的美妙故事
評(píng)論