91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內(nèi)不再提示

Linux內(nèi)核的代碼隱藏的美妙故事

Linux閱碼場 ? 來源:未知 ? 作者:工程師曾玲 ? 2018-09-23 14:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

啟動Linux系統(tǒng),Ctrl + Alt + T打開一個終端窗口,執(zhí)行如下命令,喚出GDB,并打開描述內(nèi)核空間的kcore虛擬文件。

$ sudo gdb --core /proc/kcore

然后在GDB中執(zhí)行如下命令加載內(nèi)核的符號信息:

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

再切換為INTEL風格的反匯編

(gdb) set disassembly-flavor intel

接下來反匯編用于系統(tǒng)重啟的SYSC_reboot內(nèi)核函數(shù):

(gdb)disassemble SYSC_reboot

結(jié)果類似下圖所示。

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

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

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

這個常量很酷吧?Feel Dead。Linus大神是著名的語言大師,常常語出驚人,用非常簡短的語言說出人間真善美,說出他人所不敢說。因為這個函數(shù)是用來重啟的,如果不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歲的棒小伙,應該是大學畢業(yè)不久吧,當時知道Linux的還不多。有一天,Linus親自授課,宣傳Linux的用法。課程結(jié)束時,Linus留了一個課后測驗,要求參加者做好了以郵件形式交卷。結(jié)果,有一位上課的美女在交測驗結(jié)果的同時向Linus發(fā)出了一個約會的邀請,于是一場培訓成就了一段美妙的姻緣,這個女生(Tove)成了Linus的太太。值得一提的是,Linus太太武功高強,曾經(jīng)6次奪得芬蘭國家級別的跆拳道比賽冠軍。

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

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

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

2015年8月,opensource.com特別采訪了已經(jīng)在讀大學的Patricia。

https://opensource.com/life/15/8/patricia-torvalds-interview

報道提到,Patricia熱愛計算機科學,已經(jīng)在多個IT公司實習,技術(shù)方面小有成就,大有子承父業(yè)的雄心壯志。

(照片來自opensource.com)

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

cmp edi,0x16041998

cmp edi,0x20112000

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

那么這些神秘的常量是如何用的呢?這要看一下reboot API的函數(shù)原型。

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

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

換句話來說,要想成功調(diào)用reboot API,那么前兩個參數(shù)必須嚴格按如下規(guī)則填寫:

第一個參數(shù)必須是0xfee1dead。

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

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

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

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

在內(nèi)核代碼中,上述規(guī)則是在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,有點含糊??!哈哈。

因為應用程序調(diào)用這個系統(tǒng)服務的時候必須使用這一系列常量,因為它們的定義寫在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內(nèi)核代碼中,而且使它們成為Linux API的一部分。這意味著,這將成為永遠。只要Linux系統(tǒng)還在,那么這些常量就將永遠使用,因為API意味著用戶態(tài)和內(nèi)核態(tài)的法定接口。為了保障應用程序的兼容性,不可輕易變化。

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

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

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

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

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

    關注

    4

    文章

    1470

    瀏覽量

    42905
  • Linux
    +關注

    關注

    88

    文章

    11771

    瀏覽量

    219111
  • 代碼
    +關注

    關注

    30

    文章

    4970

    瀏覽量

    74021

原文標題:雕刻在LINUX內(nèi)核中的LINUS故事

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux內(nèi)核驅(qū)動開發(fā)的技術(shù)核心精要

    社區(qū)維護流程。 總之,Linux驅(qū)動開發(fā)要求開發(fā)者融會貫通并發(fā)、中斷、內(nèi)存、設備模型、調(diào)試等維度,不斷實踐并跟進內(nèi)核演進,方能寫出健壯高效的底層代碼
    發(fā)表于 03-10 13:56

    Linux內(nèi)核編碼風格權(quán)威總結(jié):從縮進到底層設計,讓你的代碼更“內(nèi)核味”

    作為全球最龐大的開源項目之一,Linux 內(nèi)核代碼量早已突破千萬行。要讓來自世界各地的開發(fā)者高效協(xié)作,一套統(tǒng)一、嚴謹?shù)木幋a風格必不可少 —— 這不僅是 “代碼顏值” 的要求,更是可讀
    的頭像 發(fā)表于 02-09 16:29 ?147次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>編碼風格權(quán)威總結(jié):從縮進到底層設計,讓你的<b class='flag-5'>代碼</b>更“<b class='flag-5'>內(nèi)核</b>味”

    Linux內(nèi)核bug狩獵指南:從棧跟蹤到修復,官方文檔教你搞定系統(tǒng)核心故障

    內(nèi)核Linux 系統(tǒng)的 “心臟”—— 一旦它出 bug,小則功能異常,大則系統(tǒng)崩潰、死機。但內(nèi)核 bug 往往藏在百萬行代碼中,想快速定位、修復絕非易事。
    的頭像 發(fā)表于 02-06 16:59 ?3142次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>bug狩獵指南:從棧跟蹤到修復,官方文檔教你搞定系統(tǒng)核心故障

    Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計時?

    Linux 內(nèi)核的世界里,有一個默默工作的 "計時器"——jiffies。它不像我們手機上的時鐘那樣顯示年月日,卻掌控著內(nèi)核中絕大多數(shù)時間相關的操作:從進程調(diào)度到設備驅(qū)動的定時檢查,都離不開它的身影。
    的頭像 發(fā)表于 02-04 16:27 ?843次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的“心跳”:jiffies如何為系統(tǒng)計時?

    深入RK3588內(nèi)核:rockchip_linux_defconfig的作用與調(diào)試價值

    在 RK3588 芯片的 Linux 開發(fā)中,有一個文件始終是開發(fā)者繞不開的核心 ——kernel/arch/arm64/configs/rockchip_linux_defconfig。無論是首次
    的頭像 發(fā)表于 02-03 15:56 ?1184次閱讀
    深入RK3588<b class='flag-5'>內(nèi)核</b>:rockchip_<b class='flag-5'>linux</b>_defconfig的作用與調(diào)試價值

    Linux系統(tǒng)內(nèi)核參數(shù)調(diào)優(yōu)實戰(zhàn)指南

    Linux 內(nèi)核參數(shù)調(diào)優(yōu)是系統(tǒng)性能優(yōu)化的核心環(huán)節(jié)。隨著云原生架構(gòu)的普及和硬件性能的飛速提升,默認的內(nèi)核參數(shù)配置往往無法充分發(fā)揮系統(tǒng)潛力。在高并發(fā) Web 服務、大數(shù)據(jù)處理、容器化部署等場景下,合理的
    的頭像 發(fā)表于 01-28 14:27 ?468次閱讀

    【「Linux 設備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】Linux內(nèi)核開發(fā)基礎

    感謝電子發(fā)燒友論壇提供的《Linux設備驅(qū)動開發(fā)(第2版)》閱讀機會,測評將從Linux內(nèi)核開發(fā)基礎、Linux內(nèi)核平臺抽象和設備驅(qū)動程序、
    發(fā)表于 01-12 22:45

    【「Linux 設備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】+讀內(nèi)核處理的核心輔助函數(shù)

    上周收到《Linux 設備驅(qū)動開發(fā)(第 2 版)》書籍,這是一本介紹Linux內(nèi)核開發(fā)的指導性書籍。全面了解Linux內(nèi)核所提供的一些接口函
    發(fā)表于 01-10 22:08

    深入Linux內(nèi)核:進程調(diào)度的核心邏輯與實現(xiàn)細節(jié)

    ,背后都離不開內(nèi)核調(diào)度算法的精準操控。今天,我們就從優(yōu)先級、調(diào)度算法、時間片分配到底層實現(xiàn),全方位拆解Linux內(nèi)核進程調(diào)度的核心邏輯。 一、進程調(diào)度的“身份標識”:優(yōu)先級與分類 要理解調(diào)度邏輯,首先得搞懂:進程憑什么“插隊”?
    的頭像 發(fā)表于 12-24 07:05 ?4337次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>:進程調(diào)度的核心邏輯與實現(xiàn)細節(jié)

    代碼里的青春——我與RT-Thread的故事

    故事,與各位小伙伴分享。如果你也有故事,那么請一起參與進來——你的代碼歲月,值得被記錄!悟空的故事RT-Thread相伴,共赴五年時光之約邂逅期初入行時,對未知充滿
    的頭像 發(fā)表于 12-12 20:11 ?1105次閱讀
    <b class='flag-5'>代碼</b>里的青春——我與RT-Thread的<b class='flag-5'>故事</b>

    Linux內(nèi)核printk日志級別全解析:從參數(shù)解讀到實操配置

    一、開篇:一個命令引出的核心問題 在?Linux?終端執(zhí)行?cat /proc/sys/kernel/printk,你可能會看到這樣的輸出: 這串數(shù)字不是隨機的,而是內(nèi)核日志系統(tǒng)的“核心配置開關
    的頭像 發(fā)表于 11-20 15:54 ?1720次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>printk日志級別全解析:從參數(shù)解讀到實操配置

    deepin亮相2025中國Linux內(nèi)核開發(fā)者大會

    11 月 1 日,第二十屆中國 Linux 內(nèi)核開發(fā)者大會(CLK)在深圳舉辦。CLK 作為國內(nèi) Linux 內(nèi)核領域極具影響力的峰會,由清華大學、Intel、華為、阿里云、富士通南大
    的頭像 發(fā)表于 11-05 17:59 ?837次閱讀

    Linux內(nèi)核參數(shù)調(diào)優(yōu)方案

    在高并發(fā)微服務環(huán)境中,網(wǎng)絡性能往往成為K8s集群的瓶頸。本文將深入探討如何通過精細化的Linux內(nèi)核參數(shù)調(diào)優(yōu),讓你的K8s節(jié)點網(wǎng)絡性能提升30%以上。
    的頭像 發(fā)表于 08-06 17:50 ?974次閱讀

    如何配置和驗證Linux內(nèi)核參數(shù)

    Linux系統(tǒng)運維和性能優(yōu)化中,內(nèi)核參數(shù)(sysctl)的配置至關重要。合理的參數(shù)調(diào)整可以顯著提升網(wǎng)絡性能、系統(tǒng)穩(wěn)定性及資源利用率。然而,僅僅修改參數(shù)是不夠的,如何驗證這些參數(shù)是否生效同樣關鍵。
    的頭像 發(fā)表于 05-29 17:40 ?1171次閱讀

    樹莓派4 性能大比拼:標準Linux與實時Linux 4.19內(nèi)核的延遲測試

    引言本文是對我之前關于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標準內(nèi)核,以及應用了RT補丁的相似內(nèi)核版本。對于實時版,我
    的頭像 發(fā)表于 03-25 09:39 ?844次閱讀
    樹莓派4 性能大比拼:標準<b class='flag-5'>Linux</b>與實時<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內(nèi)核</b>的延遲測試