一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

$ sudo gdb --core /proc/kcore

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

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

再切換為INTEL風(fēng)格的反匯編

(gdb) set disassembly-flavor intel

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

(gdb)disassemble SYSC_reboot

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

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

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

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

這個(gè)常量很酷吧?Feel Dead。Linus大神是著名的語(yǔ)言大師,常常語(yǔ)出驚人,用非常簡(jiǎn)短的語(yǔ)言說(shuō)出人間真善美,說(shuō)出他人所不敢說(shuō)。因?yàn)檫@個(gè)函數(shù)是用來(lái)重啟的,如果不feel dead,干嘛要重啟呢?

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

cmp edi,0x28121969

這個(gè)常量是不也很特別,0x28121969,是不很像是日期,對(duì)的,這就是Linus大神的出生年月日,1969年12月28日。明年,Linus大神50歲了,時(shí)光如流水啊,當(dāng)年的毛頭小伙,就要50歲了。三十而立,四十不惑,五十而知天命。Linus大神顯然提前完成了“知天命”的目標(biāo)。他就是上天派下來(lái)革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)稱(chēng)ALS)在美國(guó)舉行,這是Linux發(fā)展早期的一個(gè)年度盛會(huì)。在周五晚上的感謝晚宴上,Linus全家出席,在會(huì)議的相冊(cè)中,可以看到幸福的一家人。

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

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

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

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

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

(照片來(lái)自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)于上述常量的說(shuō)明:

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)里的一句說(shuō)這些常量的十六進(jìn)制是富有含義的,誠(chéng)然。

換句話(huà)來(lái)說(shuō),要想成功調(diào)用reboot API,那么前兩個(gè)參數(shù)必須嚴(yán)格按如下規(guī)則填寫(xiě):

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

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

當(dāng)Linus有了大女兒Patricia后,第二個(gè)參數(shù)也可以是Patricia的生日0x5121996。這樣說(shuō)有點(diǎn)不精確,精確的說(shuō)法是從Linux內(nèi)核2.1.17版本開(kāi)始,第二個(gè)參數(shù)也可以是0x5121996。查閱kernel.org上的內(nèi)核發(fā)布?xì)v史,2.1.17應(yīng)該發(fā)布于1996年12月22日。可以想見(jiàn),Linus大神在喜得愛(ài)女的幾天內(nèi)就修改了內(nèi)核代碼,然后在女兒滿(mǎn)月之前把把這個(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寫(xiě)在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

如此看來(lái),Linus大神不僅把這些常量寫(xiě)在Linux內(nèi)核代碼中,而且使它們成為L(zhǎng)inux API的一部分。這意味著,這將成為永遠(yuǎn)。只要Linux系統(tǒng)還在,那么這些常量就將永遠(yuǎn)使用,因?yàn)锳PI意味著用戶(hù)態(tài)和內(nèi)核態(tài)的法定接口。為了保障應(yīng)用程序的兼容性,不可輕易變化。

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

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

某種程度上來(lái)說(shuō),人生應(yīng)該在實(shí)現(xiàn)一個(gè)個(gè)“既濟(jì)”的成果之后,不斷地向著“未濟(jì)”的目標(biāo)進(jìn)軍。這也意味著人生要不斷學(xué)習(xí),用《荀子》一書(shū)開(kāi)篇的話(huà)來(lái)說(shuō)就是“學(xué)不可以已(停止)”。

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

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

    關(guān)注

    3

    文章

    1416

    瀏覽量

    41442
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213823
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70748

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

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    Linux內(nèi)核編譯失敗?移動(dòng)硬盤(pán)和虛擬機(jī)的那些事兒

    Linux開(kāi)發(fā)中,編譯內(nèi)核是一項(xiàng)常見(jiàn)任務(wù),但不少開(kāi)發(fā)者在移動(dòng)硬盤(pán)或虛擬機(jī)環(huán)境下嘗試時(shí)會(huì)遭遇失敗。本文將簡(jiǎn)要探討這些問(wèn)題的成因,并介紹一些虛擬機(jī)使用技巧,幫助大家更好地應(yīng)對(duì)相關(guān)問(wèn)題。在移動(dòng)硬盤(pán)里編譯
    的頭像 發(fā)表于 04-11 11:36 ?347次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>編譯失敗?移動(dòng)硬盤(pán)和虛擬機(jī)的那些事兒

    樹(shù)莓派4 性能大比拼:標(biāo)準(zhǔn)Linux與實(shí)時(shí)Linux 4.19內(nèi)核的延遲測(cè)試

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

    騰訊云內(nèi)核團(tuán)隊(duì)修復(fù)Linux關(guān)鍵Bug

    騰訊云操作系統(tǒng)(Tencent OS)內(nèi)核團(tuán)隊(duì)近日在Linux社區(qū)取得了顯著成果。他們提交的兩項(xiàng)改進(jìn)方案,成功解決了自2021年以來(lái)一直困擾眾多一線(xiàn)廠商,并在近期讓多個(gè)Linux頂級(jí)
    的頭像 發(fā)表于 12-31 10:58 ?663次閱讀

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡(jiǎn)介

    學(xué)到本章節(jié),大家應(yīng)該對(duì)Linux操作系統(tǒng)都有了一定的了解,但可能還不知道我們拿到手的內(nèi)核源碼都經(jīng)歷了什么。linux有一個(gè)龐大的開(kāi)源社區(qū),每個(gè)人都可以向開(kāi)源社區(qū)提交代碼。由于
    發(fā)表于 12-16 13:08

    飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核代碼的目錄結(jié)構(gòu)和文件說(shuō)明

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

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡(jiǎn)介

    學(xué)到本章節(jié),大家應(yīng)該對(duì)Linux操作系統(tǒng)都有了一定的了解,但可能還不知道我們拿到手的內(nèi)核源碼都經(jīng)歷了什么。linux有一個(gè)龐大的開(kāi)源社區(qū),每個(gè)人都可以向開(kāi)源社區(qū)提交代碼。由于
    發(fā)表于 12-13 09:03

    嵌入式工程師都在找的【Linux內(nèi)核調(diào)試技術(shù)】建議收藏!

    內(nèi)核調(diào)試技術(shù),并通過(guò)一個(gè)案例分析來(lái)幫你加深理解。 常見(jiàn)的Linux內(nèi)核調(diào)試技術(shù) printk()調(diào)試技術(shù) printk()是調(diào)試內(nèi)核代碼
    發(fā)表于 11-28 15:37

    deepin社區(qū)亮相第19屆中國(guó)Linux內(nèi)核開(kāi)發(fā)者大會(huì)

    中國(guó) Linux 內(nèi)核開(kāi)發(fā)者大會(huì),作為中國(guó) Linux 內(nèi)核領(lǐng)域最具影響力的峰會(huì)之一,一直以來(lái)都備受矚目。
    的頭像 發(fā)表于 10-29 16:35 ?931次閱讀

    linux內(nèi)核中通用HID觸摸驅(qū)動(dòng)

    linux內(nèi)核中,為HID觸摸面板實(shí)現(xiàn)了一個(gè)通用的驅(qū)動(dòng)程序,位于/drivers/hid/hid-multitouch.c文件中。hid觸摸驅(qū)動(dòng)是以struct hid_driver實(shí)現(xiàn),首先定義一個(gè)描述hid觸摸驅(qū)動(dòng)的結(jié)構(gòu)mt_driver。
    的頭像 發(fā)表于 10-29 10:55 ?2334次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b>中通用HID觸摸驅(qū)動(dòng)

    詳解linux內(nèi)核的uevent機(jī)制

    linux內(nèi)核中,uevent機(jī)制是一種內(nèi)核和用戶(hù)空間通信的機(jī)制,用于通知用戶(hù)空間應(yīng)用程序各種硬件更改或其他事件,比如插入或移除硬件設(shè)備(如USB驅(qū)動(dòng)器或網(wǎng)絡(luò)接口)。uevent表示“用戶(hù)空間
    的頭像 發(fā)表于 09-29 17:01 ?1907次閱讀

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    ,需要了解Linux內(nèi)核的基本概念和API。以下是一些關(guān)鍵概念: 1.1 內(nèi)核模塊:Linux內(nèi)核模塊是一種動(dòng)態(tài)加載和卸載的
    的頭像 發(fā)表于 08-30 15:02 ?1102次閱讀

    linux驅(qū)動(dòng)程序的編譯方法是什么

    Linux驅(qū)動(dòng)程序的編譯方法主要包括兩種: 與內(nèi)核一起編譯 和 編譯成獨(dú)立的內(nèi)核模塊 。以下是對(duì)這兩種方法的介紹: 一、與內(nèi)核一起編譯 與內(nèi)核
    的頭像 發(fā)表于 08-30 14:46 ?1258次閱讀

    Linux內(nèi)核測(cè)試技術(shù)

    Linux 內(nèi)核Linux操作系統(tǒng)的核心部分,負(fù)責(zé)管理硬件資源和提供系統(tǒng)調(diào)用接口。隨著 Linux 內(nèi)核的不斷發(fā)展和更新,其復(fù)雜性和
    的頭像 發(fā)表于 08-13 13:42 ?1307次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>測(cè)試技術(shù)

    Linux內(nèi)核中的頁(yè)面分配機(jī)制

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