本文原创是freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/9304991

从大二开始学习Linux内核,到现在已经4年了。在大学的时候,学习Linux内核仅仅是作为一种爱好,因为国内罕有人能在本科毕业之后直接从事Linux内核研发工作,而哦也从未打算读研。

学习内核是一件很有趣的事情。仅仅是出于兴趣。当很想知道命令是如何从键盘输入到计算机并且关联到进程的时候,我翻出了Linux内核的源代码。然而,面对的问题越来越多,好像一个潘多拉盒子,一旦打开了,就一发不可收拾。当很想知道什么是进程的时候,会去翻阅内核关于进程的结构体。然而,更复杂的问题是,内核的作者是怎么在一个裸机上相处要把“进程”这个概念意淫出来的呢?这一系列的问题对我的吸引好似毒瘾。

操作系统本质的任务是为了是计算机工作更有效率,各种资源压榨更彻底。所以,内核hacker本质上是最优秀的吸血鬼。

正因为操作系统需要压榨硬件的资源,所以需要对硬件比较熟悉——当然,并不是说每个内核工程师都是驱动工程师。有的可能只是对算法比较有研究,优化了某一个数据结构或者算法。然而,所有的优化都是为了使硬件干活儿更有效率,所以,对硬件的熟悉是最基础的——如果不熟悉硬件的特性,那么,即便做了很多的优化,也是为了优化而优化。

与操作系统关系最密切的硬件莫过于CPU。关于CPU,最核心的莫过于多任务管理、内存管理。前者是操作系统的两大核心之一,后者是前者的基础。

关于CPU的任务,有三个概念必须要搞清楚。任务的定义、上下文切换、内存的分段segment(注意与汇编里的代码段、数据段、堆栈段区分,这三个概念一般是在同一个物理内存的segment内的)。其中,任务基本上是意淫出来的(个人观点)。对于CPU而言,需要做的就是去查IP指向了内存的哪里,然后去执行,至于是否是一个任务,它本身不在意。而当intel人为地定义出一个任务概念之后,关于任务这个对象的属性就出来了,intel用一个专用tr寄存器用于存储指向当前任务的任务描述符地址。当tr指向哪一条任务描述符了,哪一个任务就被意淫为正在执行。当tr指向另外一个任务描述符的时候,另外一个任务就是正在执行了。Linux内核有专门的switch_to()这样一个宏定义(实际上是汇编指令)来做这个事儿。这个过程被称为上下文切换。当然,上下文切换有很多复杂的工作要做,最基本的就是要把当前的任务的执行情况保存起来。

如何保存呢?

当然要用到栈了。(栈并非是C语言专用的数据结构,而是一种通用的数学概念,一种通用的机制,只不过天朝的叫兽很喜欢把C和栈捏到一起意淫)。

早期的Linux内核为一个进程分配了一个page减去task_struct大小的内核栈,用于存储内核态的上下文信息。

说远了,回到上下文切换的概念。

大家都知道上下文切换是一个很耗费资源的工作。应该尽量避免。

有一个很傻很天真的问题摆在这里。

既然上下文切换是应该避免的问题,为什么内核还要提供上下文切换的功能呢?那不是在自己打嘴巴吗?

准确的说,这是一个关于人性本自私的话题的探讨——觉得穿越了吧?

说上下文切换不好,是站在应用(说话者所支持的应用)的立场来说话的。比如说,一个Linux企业系统出现了大量的上下文切换,DBA抱怨说,这个系统太fuck了,Oracle还怎么跑嘛?他是站在Oracle的角度来说话的。

而在操作系统的角度,它觉得自己已经协调好了各个任务的资源配置,尽最大的努力让各个任务都能均衡执行。至于各个任务性能还是不能让人满意,关键问题是应用太多了——老子就那么两个核,丢过来几万个任务,上下文切换能不多吗?我日。

至于在CPU的角度,内存里有多少代码,老子就跑多久,一个任务是跑,一万个任务也是跑。老子跑就是了,你应用设计的合不合理,应用跑得爽不爽,关老子鸟事。

好吧,再回到内存分段的概念。

现代操作系统用的其实是分页管理。至于分段管理,那是30年前过时的技术了——可笑的是,直到2013年,天朝很多高校的汇编课程讲解的重点就是80x86的分段管理(还是实模式那种)。

80x86系列的分页管理核心在于逻辑地址、虚拟地址、线性地址、物理地址之间的转换。页目录、页表实现的机制。

CPU的三个概念就占了很大的篇幅了。说了这么多,不是想在这里讲解很多知识。主要是想说明,Linux内核学习是一个很复杂的问题,是一个真正的兴趣驱动的过程。相对而言,如果你选择一个商业产品,无论你多么自信地说自己爱Oracle数据库,恨不能天天与它做爱,但是,参加一个月培训后,就能正常干活了——对你而言实在是太容易了。

你需要持续的动力,持续的热情。需要能在一个夜晚读内核源代码读到黑夜变白天。

有这种战斗的精神,无论是Linux内核,还是你喜欢的女孩子,还是事业,都是你的。

Linux内核学习趣谈的更多相关文章

  1. Linux 内核学习的经典书籍及途径

    from:http://www.zhihu.com/question/19606660 知乎 Linux 内核学习的经典书籍及途径?修改 修改 写补充说明 举报   添加评论 分享 • 邀请回答   ...

  2. 关于Linux内核学习的误区以及相关书籍介绍

    http://www.hzlitai.com.cn/article/ARM9-article/system/1605.html 写给Linux内核新手-关于Linux内核学习的误区 先说句正经的:其实 ...

  3. linux内核学习之二:编译内核

    在linux内核学习系列的第一课中讲述了搭建学习环境的过程(http://www.cnblogs.com/xiongyuanxiong/p/3523306.html),环境搭好后,马上就进入到下一环节 ...

  4. linux内核学习之一:环境搭建--安装Debian7.3

    本系列文章假设读者已对linux有一定的了解,其实学习linux内核不需要有很深的关于linux的知识,只需要了解以下内容:linux基础知识及基本shell命令:现代操作系统的基本概念:C语言和gc ...

  5. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  6. Linux内核学习笔记-1.简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  7. Linux 内核学习经验总结

    Linux 内核学习经验总结 学习内核,每个人都有自己的学习方法,仁者见仁智者见智.以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下. 内核学习,一偏之见:疏漏难 ...

  8. Linux内核分析——Linux内核学习总结

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核学习总结 一 ...

  9. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

随机推荐

  1. Asp.Net MVC5入门学习系列②

    原文:Asp.Net MVC5入门学习系列② 添加一个Controller(控制器) 因为我们用的是Asp.Net MVC,MVC最终还是一套框架,所以我们还是需要遵循它才能玩下去,或者说是更好的利用 ...

  2. POJ 1028 Web Navigation 题解

    考查代码能力的题目.也能够说是算法水题,呵呵. 推荐新手练习代码能力. 要添加难度就使用纯C实现一下stack,那么就有点难度了,能够使用数组模拟环形栈.做多了,我就直接使用STL了. #includ ...

  3. 过度补脑系列:Nokia的不归路

    没有数据,没有调查,只是突然想起诺基亚... 23号的一节酱油课,脑海中突然闪过两个关键字--nokia & android 于是用手机百度了一下,竟然真的出了新机型,NokiaX,X东24日 ...

  4. Linux文件系统文件大小限制

    去阿里面试,被问到了Linux文件系统中文件大小的限制,当时就无语了.学操作系统时这些都是现算的,回来赶紧查一下. 以下为红帽ext3文件系统所支持的max file size和max filesys ...

  5. highchart几个图表马金摘要

    1)  Js的引入顺序不对,导致highchart的图表出不来. 由于Highchart插件中用到了jquery,jquery的js要在引入highchart的js之前引入,否则当会导致当载入high ...

  6. ASP.NET vNext 在 Mac OS

    让 ASP.NET vNext 在 Mac OS 中飞呀飞...   写在前面 阅读目录: 娓娓道来 Install ASP.NET vNext Command Line Tools 安装 Homeb ...

  7. bash元字符(上)

    元字符 行动 样例 回车换行 结束一个命令 空格 切割命令行中的元素 ls /etc Tab 命令自己主动补全 # 開始一行凝视 #This is a comment line " 引用多个 ...

  8. 【转】【Android工具】被忽略的UI检视利器:Hierarchy Viewer

    原文:http://blog.csdn.net/ddna/article/details/5527072 Hierarchy Viewer是随AndroidSDK发布的工具,位置在tools文件夹下, ...

  9. .net微软消息队列(msmq)简单案例

    1.首先我们需要安装消息队列服务,它是独立的消息记录的服务,并保存在硬盘文件中. 我们添加名为:DMImgUpload的私有消息队列. 2.定义消息队列的连接字符串建议采用IP: (1)FormatN ...

  10. Metadata是.NET平台的核心灵魂--(转载)

    (转载)Metadata是.NET平台的核心灵魂 July 7th, 2010 jzli Leave a comment Go to comments 网友来信:李老师,您好!我参加过你去年到我们公司 ...