<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jack Jiang

    我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
    posts - 494, comments - 13, trackbacks - 0, articles - 1

    本文內容由公眾號“格友”原創分享。

    1、引言

    (不羈的大神,連豎中指都這么帥)

    因為LINUX操作系統的流行,Linus 已經成為地球人都知道的名人。雖然大家可能都聽過錢鐘書先生的名言:“假如你吃個雞蛋覺得味道不錯,又何必認識那個下蛋的母雞呢?” 但是如果真是遇到一個“特別顯赫”的雞蛋,很多人還是想看看能生出這顆神蛋的母雞的,或者想聽聽這只母雞的故事。

    其實,在Linux內核的代碼里,就隱藏著關于Linus大神的一些美妙故事。

    (本文同步發布于:http://www.52im.net/thread-1859-1-1.html

    2、代碼中隱藏著“feel dead”這句話

    啟動Linux系統,Ctrl + Alt + T打開一個終端窗口,執行如下命令,喚出GDB,并打開描述內核空間的kcore虛擬文件:

    $ sudo gdb --core /proc/kcore

    然后在GDB中執行如下命令加載內核的符號信息:

    (gdb) file /home/ge/work/linux-3.12.2/vmlinux

    再切換為INTEL風格的反匯編:

    (gdb) set disassembly-flavor intel

    接下來反匯編用于系統重啟的SYSC_reboot內核函數:

    (gdb) disassemble  SYSC_reboot

    結果類似下圖所示:

    對于看到匯編就暈的看官勿要急(^_^),其實x86匯編是非常簡單易懂的,特別是這個函數很好理解,里面充滿著故事。另外,這可是地地道道Linus大神所寫的代碼啊。

    在這個函數里有一串比較指令,有理且有趣。不妨先看這一句:

    cmp DWORD PTR [ebp-0x114],0xfee1dead

    這個常量很酷吧?Feel Dead(中文直譯就是“感覺要死了!”)。Linus大神是著名的語言大師,常常語出驚人,用非常簡短的語言說出人間真善美,說出他人所不敢說。因為這個函數是用來重啟的,如果不feel dead,干嘛要重啟呢?

    3、Linus大神的生日也藏在了代碼中

    再往下看,會看到這樣一條比較指令:

    cmp    edi,0x28121969

    這個常量是不也很特別,0x28121969,是不很像是日期,對的,這就是Linus大神的出生年月日:1969年12月28日。

    明年,Linus大神50歲了,時光如流水啊,當年的毛頭小伙,就要50歲了。三十而立,四十不惑,五十而知天命。Linus大神顯然提前完成了“知天命”的目標。他就是上天派下來革Windows的命的。(^_^)

    4、Linus大神把一家人都藏在代碼里了

    再往下看,還有一個日期:

    cmp    edi,0x5121996

    1996年12月5日,這個日期是什么呢?是Linus大女兒的生日。

    把時光倒退回1993年,那時Linus還是24歲的棒小伙,應該是大學畢業不久吧,當時知道Linux的還不多。有一天,Linus親自授課,宣傳Linux的用法。課程結束時,Linus留了一個課后測驗,要求參加者做好了以郵件形式交卷。結果,有一位上課的美女在交測驗結果的同時向Linus發出了一個約會的邀請,于是一場培訓成就了一段美妙的姻緣,這個女生(Tove)成了Linus的太太。值得一提的是,Linus太太武功高強,曾經6次奪得芬蘭國家級別的跆拳道比賽冠軍。

    1997年6月,第二屆亞特蘭大Linux展示會(Atalanta Linux Showcase,簡稱ALS)在美國舉行,這是Linux發展早期的一個年度盛會。在周五晚上的感謝晚宴上,Linus全家出席,在會議的相冊中,可以看到幸福的一家人。

    (照片來自http://linuxshowcase.org)

    照片中,Tove深情地看著Linus。Linus抱著的就是他們的大女兒,名叫Patricia Torvalds。Linus把她稱作Linus v2.0。在位于母校網站的一個個人主頁上( https://www.cs.helsinki.fi/u/torvalds/),Linus放了幾張Patricia嬰兒時的照片,至今仍在,好久沒有更新了。從網頁上的信箱(torvalds@transmeta.com)來看,當時Linus還沒有全職做Linux,還在Transmeta公司工作。

    (照片來自https://www.cs.helsinki.fi/u/torvalds/)

    2015年8月,opensource.com特別采訪了已經在讀大學的Patricia(報道地址:https://opensource.com/life/15/8/patricia-torvalds-interview)。報道提到,Patricia熱愛計算機科學,已經在多個IT公司實習,技術方面小有成就,大有子承父業的雄心壯志。

    (照片來自opensource.com)

    照片中站在中間便是Patricia,她旁邊的另兩個年輕女生是她的兩個妹妹,她們的生日也可以在上面的匯編代碼里找到:

    cmp    edi,0x16041998

    cmp    edi,0x20112000

    一位是98年,一位是00后。

    5、那么,這些神秘的常量是如何用的呢?

    這要看一下reboot API的函數原型:

    int reboot(int magic, int magic2, int cmd, void *arg);

    在這個API的文檔中(man reboot(2)),可以看到關于上述常量的說明: 

    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.)

    括號里的一句說這些常量的十六進制是富有含義的,誠然。

    換句話來說,要想成功調用reboot API,那么前兩個參數必須嚴格按如下規則填寫:

    1)第一個參數必須是0xfee1dead;

    2)在Linus大神的大女兒Patricia出生之前,第二個參數能且只能是0x28121969,也就是大神的生日;

    3)當Linus有了大女兒Patricia后,第二個參數也可以是Patricia的生日0x5121996。這樣說有點不精確,精確的說法是從Linux內核2.1.17版本開始,第二個參數也可以是0x5121996。查閱kernel.org上的內核;4)發布歷史,2.1.17應該發布于1996年12月22日。可以想見,Linus大神在喜得愛女的幾天內就修改了內核代碼,然后在女兒滿月之前把把這個代碼發布給世界了;

    5)當Linus有二女兒后,第二個參數也可以是二女兒的生日;

    6)當Linus有了小女兒后,第二個參數也可以是小女兒的生日。

    在內核代碼中,上述規則是在reboot.c中強制的,代碼如下:

    /* 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;

    這個for safety,有點含糊啊!哈哈。

    因為應用程序調用這個系統服務的時候必須使用這一系列常量,因為它們的定義寫在uapi目錄下的reboot.h,即:

    /*

     * Magic values required to use _reboot() system call.

     */

    #define        LINUX_REBOOT_MAGIC1        0xfee1dead

    #define        LINUX_REBOOT_MAGIC2        672274793

    #define        LINUX_REBOOT_MAGIC2A        85072278

    #define        LINUX_REBOOT_MAGIC2B        369367448

    #define        LINUX_REBOOT_MAGIC2C        537993216

    注意啊:在這個文件和文檔中,代表生日的四個常量都是以十進制表達的,應該是為了隱藏一下秘密吧。

    0:000> .formats 0n85072278

    Evaluate expression:

    Hex:     00000000`05121996

    如此看來,Linus大神不僅把這些常量寫在Linux內核代碼中,而且使它們成為Linux API的一部分。這意味著,這將成為永遠。只要Linux系統還在,那么這些常量就將永遠使用,因為API意味著用戶態和內核態的法定接口。為了保障應用程序的兼容性,不可輕易變化。

    6、寫在最后

    無論哪種文化,家庭都有著極其重要的地位。修身齊家治國平天下,欲治其國者,先齊其家。從上面的故事來看,Linus大神是個很愛家的男人。他把自己心愛的家庭成員生日銘記(雕刻)在了他的偉大作品之中。

    那么,Linus大神為什么選擇reboot系統調用呢?reboot代表著新的開始,代表不拘泥于現狀,從新出發,從頭再來。這是很多人都喜歡的人生哲學。在古老的易經中,第63卦是既濟,字面意思是渡河成功,代表成就了一個目標。但這并不是終結,最后一卦(第64卦)是未濟,代表還有新的目標沒有達到,需要繼續努力。

    某種程度上來說,人生應該在實現一個個“既濟”的成果之后,不斷地向著“未濟”的目標進軍。這也意味著人生要不斷學習,用《荀子》一書開篇的話來說就是“學不可以已(停止)”。

    這篇短文是帶著對Linus大神的敬意來寫的,希望大家受到鼓舞,學習Linus愛家愛代碼的敬業精神,不要誤以為老雷在褻瀆圣賢啊。

    附錄1:更多感悟文章和故事

    一個微信實習生自述:我眼中的微信開發團隊

    微信程序員創業總結:如何提高Android開發效率

    如何做一個合格的 iOS Team Leader

    程序員中年危機:拿什么拯救你,我的三十五歲

    一個魔都程序員的3年:從程序員到CTO的歷練

    為什么說即時通訊社交APP創業就是一個坑?

    致我們再也回不去的 Github ...

    一名90后二流大學程序員的自述:我是如何從“菜鳥”到“辣雞”的

    一個魔都程序員的3年:從程序員到CTO的歷練

    選擇比努力更重要:我是如何從流水線工人到程序員的?

    程序員的抉擇:必須離開帝都——因為除了工作機會,還有什么值得留戀?

    即時通訊創業必讀:解密微信的產品定位、創新思維、設計法則等

    干了這碗雞湯:從理發店小弟到阿里P10技術大牛

    程序員神級跳槽攻略:什么時候該跳?做什么準備?到哪里找工作?

    感悟分享:在騰訊的八年,我的成長之路和職業思考

    調皮的程序員:Linux之父雕刻在Linux內核中的故事

    附錄2:大廠技術往事

    技術往事:微信估值已超5千億,雷軍曾有機會收編張小龍及其Foxmail

    QQ和微信兇猛成長的背后:騰訊網絡基礎架構的這些年

    閑話即時通訊:騰訊的成長史本質就是一部QQ成長史

    2017微信數據報告:日活躍用戶達9億、日發消息380億條

    騰訊開發微信花了多少錢?技術難度真這么大?難在哪?

    技術往事:創業初期的騰訊——16年前的冬天,誰動了馬化騰的代碼》 

    技術往事:史上最全QQ圖標變遷過程,追尋IM巨人的演進歷史》 

    技術往事:“QQ群”和“微信紅包”是怎么來的?》 

    開發往事:深度講述2010到2015,微信一路風雨的背后》 

    開發往事:微信千年不變的那張閃屏圖片的由來》 

    開發往事:記錄微信3.0版背后的故事(距微信1.0發布9個月時)》 

    一個微信實習生自述:我眼中的微信開發團隊

    首次揭秘:QQ實時視頻聊天背后的神秘組織

    為什么說即時通訊社交APP創業就是一個坑?

    微信七年回顧:歷經多少質疑和差評,才配擁有今天的強大

    前創始團隊成員分享:盤點微信的前世今生——微信成功的必然和偶然

    即時通訊創業必讀:解密微信的產品定位、創新思維、設計法則等

    >> 更多同類文章 ……

    (本文同步發布于:http://www.52im.net/thread-1859-1-1.html



    作者:Jack Jiang (點擊作者姓名進入Github)
    出處:http://www.52im.net/space-uid-1.html
    交流:歡迎加入即時通訊開發交流群 215891622
    討論:http://www.52im.net/
    Jack Jiang同時是【原創Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
    本博文 歡迎轉載,轉載請注明出處(也可前往 我的52im.net 找到我)。


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    Jack Jiang的 Mail: jb2011@163.com, 聯系QQ: 413980957, 微信: hellojackjiang
    主站蜘蛛池模板: 亚洲国产精品yw在线观看| 国产精品亚洲二区在线| 毛片免费视频播放| 男女污污污超污视频免费在线看| 亚洲愉拍99热成人精品热久久| 中文字幕在线免费| 黄页视频在线观看免费| 亚洲男人天堂av| 免费理论片51人人看电影| 三年片免费高清版| 亚洲熟妇无码一区二区三区| 国产亚洲人成A在线V网站| 114一级毛片免费| free哆拍拍免费永久视频| 亚洲人成在线播放| 国产亚洲人成A在线V网站| 好大好硬好爽免费视频| 免费精品久久天干天干| 亚洲国产日韩a在线播放| 久久亚洲国产精品五月天| 四虎永久免费观看| 成人免费观看一区二区| 三年片免费观看大全国语| 亚洲第一成年网站视频| 激情内射亚洲一区二区三区| 免费jjzz在在线播放国产| 无码国产精品一区二区免费式直播 | 色欲色欲天天天www亚洲伊| 亚洲AV无码1区2区久久| 亚洲?v无码国产在丝袜线观看| 亚洲第一网站免费视频| 91视频免费观看高清观看完整| 欧美亚洲国产SUV| 亚洲人成电影青青在线播放| 久久亚洲国产成人亚| 久久久久国产亚洲AV麻豆| 香蕉视频在线观看免费国产婷婷| 永久看日本大片免费35分钟| a毛片免费播放全部完整| 羞羞视频免费网站日本| 久久精品国产亚洲av天美18|