前言
~~~~~~~~ 话说,在linux的内核深处,隐藏着一个美妙的故事,隐藏着一个父亲对儿女深沉的父爱。linus作为linux之父,创造了影响世界的linux内核。天才的代码世界里,不仅有数以万计的函数,还有着生活温馨的一面。下面本文就从linux内核中初窥linux魔力数之小故事。
魔力数之探究
~~~~~~~~
在我们重启linux系统时,总会调用一个函数:reboot。reboot不仅可以实现Restart的功能,也可以实现关机功能的。那又是怎么关机的呢?话说关机不就是延迟不确定的重启吗,关机之后总要启动的,只是这个启动还没到来,时间是不确定的。
~~~~~~~~
下面看下“kernel/sys.c”中的reboot函数,其源代码如下:
内核版本:linux-2.6.34
/*
* Reboot system call: for obvious reasons only root may call it,
* and even root needs to set up some magic numbers in the registers
* so that some mistake won't make this reboot the whole machine.
* You can also set the meaning of the ctrl-alt-del-key here.
*
* reboot doesn't sync: do that yourself before calling this.
*/
SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
void __user *, arg)
{
char buffer[256];
int ret = 0;
/* We only trust the superuser with rebooting the system. */
if (!capable(CAP_SYS_BOOT))
return -EPERM;
/* 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;
/* Instead of trying to make the power_off code look like
* halt when pm_power_off is not set do it the easy way.
*/
if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)
cmd = LINUX_REBOOT_CMD_HALT;
mutex_lock(&reboot_mutex);
switch (cmd) {
case LINUX_REBOOT_CMD_RESTART:
kernel_restart(NULL);
break;
case LINUX_REBOOT_CMD_CAD_ON:
C_A_D = 1;
break;
case LINUX_REBOOT_CMD_CAD_OFF:
C_A_D = 0;
break;
case LINUX_REBOOT_CMD_HALT:
kernel_halt();
do_exit(0);
panic("cannot halt");
case LINUX_REBOOT_CMD_POWER_OFF:
kernel_power_off();
do_exit(0);
break;
case LINUX_REBOOT_CMD_RESTART2:
if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) {
ret = -EFAULT;
break;
}
buffer[sizeof(buffer) - 1] = '\0';
kernel_restart(buffer);
break;
#ifdef CONFIG_KEXEC
case LINUX_REBOOT_CMD_KEXEC:
ret = kernel_kexec();
break;
#endif
#ifdef CONFIG_HIBERNATION
case LINUX_REBOOT_CMD_SW_SUSPEND:
ret = hibernate();
break;
#endif
default:
ret = -EINVAL;
break;
}
mutex_unlock(&reboot_mutex);
return ret;
}
~~~~~~~~ 上述源码中magic1和imagic2即魔力数变量,LINUX_REBOOT_MAGIC1、INUX_REBOOT_MAGIC2、LINUX_REBOOT_MAGIC2A、LINUX_REBOOT_MAGIC2B、LINUX_REBOOT_MAGIC2C即是魔力数宏定义。其宏定义在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
~~~~~~~~
第一个常量 0xfee1dead是不是很奇怪,有点英文的感觉。怎么看着像feel head呢?这个常量是不是很酷。Feel Dead。Linus大神是著名的语言大师,常常语出惊人,用非常简短的语言说出了卡的都有想砸电脑的冲动这种境况,越来越觉得这个魔力数的精辟!!因为这个函数是用来重启的,如果不feel dead,干嘛要重启呢?
接下来看看下面4个魔力数,等等,为什么突然用10进制来表示呢,越看越觉得不对劲呢,难道是想隐藏什么?再看其命名规则,又2衍生出3个子定义,2A、2B和2C。说到这里,我想大家已经猜出其一二。先转化成16进制瞅瞅。
672274793=0x28121969
~~~~~~~~
这个常量是不是也很特别,0x28121969,是不很像是日期,对的,这就是Linus大神的出生年月日,1969年12月28日。明年,Linus大神50岁了,时光如流水啊,当年的毛头小伙,就要50岁了。三十而立,四十不惑,五十而知天命。Linus大神显然提前完成了“知天命”的目标。也许他就是上天派下来革Windows的命的。
再来看下一个:
85072278=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全家出席,在会议的相册中,可以看到幸福的一家人。
(照片来自网络)
~~~~~~~~
照片中,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公司实习,技术方面小有成就,大有子承父业的雄心壮志。
(图片来自网络)
另外两个参数:
369367448=0x16041998
537993216=0x20112000
~~~~~~~~
这两个魔力数就是linus的二女儿和三女儿的生日,1998年4月16日,2000年11月20日。上面照片中站在中间便是Patricia,她旁边的另两个年轻女生是她的两个妹妹。
~~~~~~~~
从这个内核中的小故事可以看出,Linus大神是个很爱家的男人,家庭在他心目中有个极高的位置。他把自己心爱的家庭成员生日封存在了他的伟大作品之中,流传百世;父爱至深,源远流长。
linux之生日
~~~~~~~~
Linux操作系统诞生于1991 年10 月5 日,是第一次正式向外公布的时间。马上又是linux的生日了,下面就引自网络上的一个段子,提前预祝linux破壳日快乐O(∩_∩)O哈哈~
你TM自己编译去吧,O(∩_∩)O哈哈~666666666
漫画转自:http://tieba.baidu.com/p/4882364662?traceid=