本文内容由公众号“格友”原创分享。

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

调皮的程序员:Linux之父雕刻在Linux内核中的故事的更多相关文章

  1. C# 你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )

    你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )   一个家庭 相当于 一个空间,这个空间里 有 很多元素,比如 爱,爱这个抽象事物,可能有很多动作,接吻.交流,对于一 ...

  2. 每一个程序员需要了解的10个Linux命令

    作为一个程序员,在软件开发职业生涯中或多或少会用到Linux系统,并且可能会使用Linux命令来检索需要的信息.本文将为各位开发者分享10个有用的Linux命令,希望对你会有所帮助. 以下就是今天我们 ...

  3. 【转】每一个程序员需要了解的10个Linux命令

    作为一个程序员,在软件开发职业生涯中或多或少会用到Linux系统,并且可能会使用Linux命令来检索需要的信息.本文将为各位开发者分享10个有用的Linux命令,希望对你会有所帮助. 以下就是今天我们 ...

  4. Java全栈程序员之01:做个Linux下的程序猿

    Windows10正在成为史上口碑最差的Windows系统 (图侵删) 我曾经花了数次1小时去寻找解决方案去关闭自动更新,包括停掉服务.修改注册表等等.但是都没有成功. 微软自身是知道这个问题的,但就 ...

  5. Linux之父访谈录:设计内核只为了好玩

    2010-09-20 10:36 “有 些人生来就具有统率百万人的领袖风范;另一些人则是为写出颠覆世界的软件而生.唯一一个能同时做到这两 者的人,就是Linus Torvalds.”这是美国<时 ...

  6. Linux之父:除了写内核代码 别的真不会(转)

    Linus Torvalds 是 Linux 之父,被誉为活着的传奇. 其实很多人不了解他也并不奇怪,因为人是在是太低调了.现年 46 岁的他每天的工作仍然是编程,领导并推动着 Linux 的发展. ...

  7. 十年京东Java程序员的工作总结,写给迷茫中的你!

    很多年前,刚刚从大学毕业的时候,很多公司来校招.其中最烂俗的一个面试问题是:“你希望你之后三到五年的发展是什么?”.我当时的标准回答是(原话):“成为在某一方面能够独当一面的技术专家“.后来经历了几家 ...

  8. 《PHP程序员面试笔试宝典》——如何克服面试中紧张的情绪?

    本文摘自<PHP程序员面试笔试宝典>. PHP面试技巧分享,PHP面试题,PHP宝典尽在"琉忆编程库". 面试的成功与否,往小的方面讲,直接关系到求职者的工作问题,往大 ...

  9. 《PHP程序员面试笔试宝典》——如何解决求职中的时间冲突问题?

    如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 对求职者而言,求职季就是一个赶场季,一天少则几家.十几家企业入校招聘,多则几十家.上百家企业招兵买马.企业多,选择项自然 ...

随机推荐

  1. MySQL索引原理以及查询优化

    转载自:https://www.cnblogs.com/bypp/p/7755307.html MySQL索引原理以及查询优化 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且 ...

  2. tablib cell() missing 1 required positional argument: 'column' 报错

    可能是安装版本问题 pip uninstall tablib, 重新安装 pip install tablib==0.11.4. 试一试

  3. Linux驱动之USB总线驱动程序框架简析

    通用串行总线(USB)是主机和外围设备之间的一种连接.USB总线规范有1.1版和2.0版,当然现在已经有了3.0版本.USB1.1支持两种传输速度:低速为1.5Mbps,高速为12Mbps.USB2. ...

  4. eclipse Filter web.xml 问题解决 异步请求@WebServlet

    <filter> <filter-name>AsynServlete</filter-name> <filter-class>com.kad.app.a ...

  5. js学习之原生js实现懒加载

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. dos命令 创建数据库,建表,两表联查,三表联查(mysql---第一篇)

    首先打开mysql的控制台,输入密码进行登录  (ps:本文的mysql控制台,是运用的php的集成环境(phpstudy),点击运行,找到mysql命令行,直接打开就可以了) 登陆成功后,就可以进行 ...

  7. java 实现udp通讯

    需求:应用A(通常有多个)和应用B(1个)进行 socket通讯,应用A必须知道应用B的ip地址(在应用A的配置文件中写死的),这个时候就必须把应用B的ip设成固定ip(但是某些时候如更换路由后要重新 ...

  8. UVa156

    #include <bits/stdc++.h> using namespace std; map<string,int> cnt; vector<string> ...

  9. 使用PHP实现手机端APP支付宝的支付功能

    最近应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,实际开发过程是前后端分离,前端调用后端API接口,实现功能返回数据,我所用的跨挤啊为TP5,大致可以分为四步: 1 ...

  10. 解决Kettle与Kerberos集成问题

    本文目的:记录Kerberos环境下,通过Kettle将MySQL数据清洗到HDFS过程解决的2个问题,希望对大家有所帮助. Kettle版本:pdi-ce-7.1.0.0-12 1.在Kerbero ...