色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux內核的代碼隱藏的美妙故事

Linux閱碼場 ? 來源:未知 ? 作者:工程師曾玲 ? 2018-09-23 14:49 ? 次閱讀

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

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

啟動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,干嘛要重啟呢?

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

cmp edi,0x28121969

這個常量是不也很特別,0x28121969,是不很像是日期,對的,這就是Linus大神的出生年月日,1969年12月28日。明年,Linus大神50歲了,時光如流水啊,當年的毛頭小伙,就要50歲了。三十而立,四十不惑,五十而知天命。Linus大神顯然提前完成了“知天命”的目標。他就是上天派下來革Windows的命的。(^_^)

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

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公司工作。

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后。

那么這些神秘的常量是如何用的呢?這要看一下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,那么前兩個參數必須嚴格按如下規則填寫:

第一個參數必須是0xfee1dead。

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

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

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

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

*/

#defineLINUX_REBOOT_MAGIC10xfee1dead

#defineLINUX_REBOOT_MAGIC2672274793

#defineLINUX_REBOOT_MAGIC2A85072278

#defineLINUX_REBOOT_MAGIC2B369367448

#defineLINUX_REBOOT_MAGIC2C537993216

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

0:000> .formats 0n85072278

Evaluate expression:

Hex: 00000000`05121996

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

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

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

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1377

    瀏覽量

    40325
  • Linux
    +關注

    關注

    87

    文章

    11322

    瀏覽量

    209857
  • 代碼
    +關注

    關注

    30

    文章

    4803

    瀏覽量

    68750

原文標題:雕刻在LINUX內核中的LINUS故事

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    騰訊云內核團隊修復Linux關鍵Bug

    騰訊云操作系統(Tencent OS)內核團隊近日在Linux社區取得了顯著成果。他們提交的兩項改進方案,成功解決了自2021年以來一直困擾眾多一線廠商,并在近期讓多個Linux頂級
    的頭像 發表于 12-31 10:58 ?209次閱讀

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-Linux內核移植之內核簡介

    學到本章節,大家應該對Linux操作系統都有了一定的了解,但可能還不知道我們拿到手的內核源碼都經歷了什么。linux有一個龐大的開源社區,每個人都可以向開源社區提交代碼。由于
    發表于 12-16 13:08

    飛凌嵌入式ElfBoard ELF 1板卡-內核代碼的目錄結構和文件說明

    將:ELF 1開發板資料包\\02-Linux代碼\\02-0 出廠內核和uboot源碼\\內核源碼\\linux-4.1.15-elf
    發表于 12-16 13:04

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內核移植之內核簡介

    學到本章節,大家應該對Linux操作系統都有了一定的了解,但可能還不知道我們拿到手的內核源碼都經歷了什么。linux有一個龐大的開源社區,每個人都可以向開源社區提交代碼。由于
    發表于 12-13 09:03

    deepin社區亮相第19屆中國Linux內核開發者大會

    中國 Linux 內核開發者大會,作為中國 Linux 內核領域最具影響力的峰會之一,一直以來都備受矚目。
    的頭像 發表于 10-29 16:35 ?532次閱讀

    詳解linux內核的uevent機制

    linux內核中,uevent機制是一種內核和用戶空間通信的機制,用于通知用戶空間應用程序各種硬件更改或其他事件,比如插入或移除硬件設備(如USB驅動器或網絡接口)。uevent表示“用戶空間
    的頭像 發表于 09-29 17:01 ?793次閱讀

    linux驅動程序如何加載進內核

    ,需要了解Linux內核的基本概念和API。以下是一些關鍵概念: 1.1 內核模塊:Linux內核模塊是一種動態加載和卸載的
    的頭像 發表于 08-30 15:02 ?518次閱讀

    linux驅動程序的編譯方法是什么

    Linux驅動程序的編譯方法主要包括兩種: 與內核一起編譯 和 編譯成獨立的內核模塊 。以下是對這兩種方法的介紹: 一、與內核一起編譯 與內核
    的頭像 發表于 08-30 14:46 ?659次閱讀

    Linux內核測試技術

    Linux 內核Linux操作系統的核心部分,負責管理硬件資源和提供系統調用接口。隨著 Linux 內核的不斷發展和更新,其復雜性和
    的頭像 發表于 08-13 13:42 ?524次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>測試技術

    Linux內核中的頁面分配機制

    Linux內核中是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講的分頁機制。本文就看下Linux內核是如何管
    的頭像 發表于 08-07 15:51 ?312次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>中的頁面分配機制

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

    自誕生以來的最大一次升級換代。HarmonyOS NEXT不依賴傳統的Unix內核Linux內核,而是依靠自主的鴻蒙內核。這就意味著,鴻蒙操作系統最終將去掉
    的頭像 發表于 06-27 11:30 ?861次閱讀

    使用 PREEMPT_RT 在 Ubuntu 中構建實時 Linux 內核

    盟通技術干貨構建實時Linux內核簡介盟通技術干貨Motrotech如果需要在Linux中實現實時計算性能,進而有效地將Linux轉變為RTOS,那么大多數發行版都可以打上名為PREE
    的頭像 發表于 04-12 08:36 ?2607次閱讀
    使用 PREEMPT_RT 在 Ubuntu 中構建實時 <b class='flag-5'>Linux</b> <b class='flag-5'>內核</b>

    C++在Linux內核開發中從爭議到成熟

    Linux 內核郵件列表中一篇已有六年歷史的老帖近日再次引發激烈討論 —— 主題是建議將 Linux 內核的開發語言從 C 轉換為更現代的 C++。
    的頭像 發表于 01-31 14:11 ?650次閱讀
    C++在<b class='flag-5'>Linux</b><b class='flag-5'>內核</b>開發中從爭議到成熟

    Ubuntu 24.04 LTS選用Linux 6.8為默認內核

    關于Ubuntu 24.04 LTS使用何種內核版本,一直備受關注。Canonical工程師Andrea Righi昨日宣布,Ubuntu 24.04將默認搭載Linux 6.8內核
    的頭像 發表于 01-29 11:27 ?1163次閱讀

    linux內核主要由哪幾個部分組成,作用是什么

    Linux內核主要由以下幾個部分組成: 進程管理:Linux內核負責管理和調度系統中的進程。它通過進程調度算法來決定哪個進程在什么時間運行以及如何分配系統資源。 內存管理:
    的頭像 發表于 01-22 14:34 ?2721次閱讀
    主站蜘蛛池模板: 偷窥wc美女毛茸茸视频| 久久99国产精品二区不卡| 国产精品内射久久久久欢欢| 快播免费电影| 一区精品在线| 后入式啪gif动态图| 香蕉59tv视频| 国产精品久久久久a影院| 色婷婷我要去我去也| 超碰97超碰在线视频哦| 秋霞电影院午夜伦高清| 扒开胸罩揉她的乳尖视频| 青柠在线电影高清免费观看| TUBE19UP老师学生| 白人大战34厘米黑人BD| 日韩一区二区三区射精| 国产成人v视频在线观看| 校草让我脱了内裤给全班看| 国产亚洲精品成人AV久久| 亚洲国产欧美另类| 久久精品国产免费| 92国产精品午夜免费福利视频| 老司机无码精品A| 97在线免费观看| 日本高清色片| 国产乱码免费卡1卡二卡3卡四卡| 亚洲国产中文在线视频免费| 久久国产乱子伦精品免费不卡| 1级午夜影院费免区| 欧美国产日韩久久久| 午夜毛片在线观看| 国产精品97久久AV麻豆| 亚洲AV成人无码网天堂| 久99re视频9在线观看| 综合人妻久久一区二区精品| 嫩草成人国产精品| 刺激性视频黄页| 午夜亚洲WWW湿好爽| 国产欧美无码亚洲毛片| 亚洲一区免费在线观看| 欧美5g影院天天爽天天看|