《用“芯”探核:基于龙芯的Linux内核探索解析》是一本基于龙芯平台,结合源代码来探索和解析Linux-5.x内核的书。

市面上解析Linux 内核的经典书籍已有不少,尤其是被称为Linux 内核领域的“四库全书”:《Linux 内核设计与实现》 《Linux设备驱动程序》 《深入理解Linux 内核》和《Linux内核源代码情景分析》。

但是,一方面,大多数已有书籍是基于X86 或者ARM 体系结构的;另一方面,大多数已有书籍基于2.4 版本或者2.6 版本的Linux 内核,虽然近年来有了许多不错的原创新书。

同时,一直以来,从事龙芯内核开发工作的“标准教程”是《龙芯处理器用户手册》、《MIPS 体系结构透视》和《深入理解Linux 内核》。然而,《龙芯处理器用户手册》不涉及Linux 内核;《MIPS 体系结构透视》讲述的是传统的MIPS 处理器,离真正的龙芯差距太大;而《深入理解Linux 内核》所使用的内核版本又过于陈旧。

因此,正如中科院计算所研究员张福新在推荐语中说的:“这本基于龙芯平台的内核开发书籍的出版,恰逢其时。”

本书作者:陈华才
博士,高级工程师。现任江苏航天龙梦信息技术有限公司副总工程师,负责龙芯3 号处理器的内核开发。作为Linux内核中MIPS/ 龙芯3 号的Maintainer,向Linux 内核官方提交了大量的代码。

为什么写这本书?

我是谁?我就是一个既爱Linux也爱龙芯的开发者。十六年前开始接触Linux内核,十二年前开始接触龙芯电脑,十年前加入龙芯产业化基地,十年来伴随着龙芯一起成长,如今已成为Linux内核中龙芯3号的Maintainer。

有人说,“干一行,爱一行”,但我觉得“爱一行,干一行”更加符合可持续发展。龙芯和Linux都是我所爱,研究起来动力十足。一直以来,我在阅读内核源代码时都有做笔记的习惯,因为人脑毕竟容量有限,在知识体系不断扩张的过程中,笔记是必不可少的。我做笔记的方法以“代码摘抄+适度精简+注释解析”为主,但是随着时间的发展和内核版本的升级,笔记总量越来越大,不同版本中的同名函数也已经变得面目全非。于是,我经常不得不在笔记中记录源代码的多个版本,并且在代码片段的开始处加上版本标识。虽然说笔记主要是给自己看的,但正如热力学第二定律所昭示的一样,笔记的可读性已经不可避免地越来越差了(熵值太大)。

于是乎,便萌生了整理笔记并编写成书的想法。最初的想法成型于2013~2014年,但真正开始动笔的时候是2015年。在写书的过程中,解析方法尽量保留了笔记中精简代码的特点,但在内核版本的选择上全部采用了最新的LTS版本(长期维护稳定版本),即5.4.x版本。

用“芯”探核 基于龙芯的Linux内核探索解析

这本书选择了哪些内容?

全书以龙芯平台为重点,主要解析Linux 内核源代码。首先对龙芯处理器和Linux 内核进行概括性的介绍,并引入一种快速而有效的代码阅读方法,即“先观其大略,再咬文嚼字”。

操作系统是整个计算机的管理者,其本质上是一个大型软件平台,顺着程序的执行流程一起前进是自然而然的事情。因此,从Linux内核在龙芯计算机上的启动过程开始研究Linux 内核是一个比较好的切入点,以此获得一个对龙芯处理器和Linux 内核的宏观印象。

内核是操作系统中最基础、最重要的部分,其三大基本功能分别是中断/异常处理、内存管理、进程管理。这3章内容尽量遵循“从基础到上层”和“广度优先深度其次”的写作原则,更方便读者根据自己的需求安排阅读顺序。Linux内核支持X86、ARM、MIPS、PowerPC等多种体系结构,但对上层应用提供了基本一致的操作接口。因此,内核的三大基本功能中一部分是体系结构相关的特定内容,一部分是体系结构无关的通用框架。

由于Linux 是一体化内核操作系统,因此设备驱动也放在内核层实现。设备驱动所涵盖的范围非常广泛,本书不可能面面俱到,只选取了两种常用的典型设备驱动——Radeon 显卡与E1000E 网卡,来做举例性的原理说明。

Linux内核博大精深,本书虽然洋洋洒洒几百页,然而在两千多万行源代码实不过是沧海一粟。虽然我试图让内容覆盖更加全面,但也只是涉及了内核启动、异常中断、内存管理、进程管理、设备驱动和电源管理等几个常见话题,而对于文件系统、网络协议等方面的内容几乎只字未提。

怎样阅读上千万行的源代码?

阅读软件源代码是每个开发者的必由之路,尤其是内核开发者。因为内核开发在很大程度上并不是重新发明轮子,而是深入理解并尽量复用现有的内核设计框架,然后参照相似的功能模块去添加或改写某项需要的功能。在对内核整体框架以及某些子系统融会贯通以后,才有可能站在巨人的肩膀上去改进框架本身,实现自主创新。

阅读代码有“广度优先”“深度优先”两种方式。代码好比一棵树,“广度优先”就是说我们要先找到主干,然后搞清楚主干上有几根树枝,再去某条感兴趣的树枝上寻找有意义的叶子;而“深度优先”指的是是碰到第一根树枝,就赶紧深入进去把所有的叶子给找出来。本书建议以广度优先为主,但在适当的时候也需要兼顾深度。因此,本书使用“树形视图”“链式视图”来解析内核源代码,而这也是我以及我的同事在日常工作中常使用的方法。树形视图具有广度,能够快速理解大型函数的主干;链式视图具有深度,能够直观理解重点函数的调用。

(树形视图)

(链式视图)

在很多现有的书籍中,都会使用流程图来描述代码逻辑。然而,流程图虽然直观,但是其描述能力有限(尤其是缺乏树形视图的层次化表达能力),往往很难精确描述一个函数的执行过程。而一个费尽心机画出来的精确的流程图,往往又会因为其复杂性而失去了直观的功能。并且,单靠流程图并不能完全理解源代码,而是需要将源代码与流程图两相对照。

因此,本书尽量用精简版的源代码(即树形视图和链式视图)来代替流程图,一方面可以快速理解多级函数的复杂调用关系,另一方面可以不需要在源代码和流程图之间反复切换。

本书除了引入树形视图和链式视图,在开篇第1章首先介绍了“先观其大略,再咬文嚼字”的代码阅读方法。具体来说分为四个步骤,即“找准入口点”“理清主脉络”“顾名思义看功能”“理解补丁文件”

从2015年开始动笔,到如今《用“芯”探核:基于龙芯的Linux内核探索解析》一书成型,其中的曲折艰辛实在是不足为外人道矣。在写书过程中,当我试图将一个基本原理向众人阐述明白的时候,才发现,其实之前自己只是似懂非懂。甚至可以说,写书最大的受益者是自己,因为整个知识体系真正得到了全面的升华。

谨以此书,献给一起为信息产业自主化而奋斗的同仁们。也希望此书,能给读者带来实质性的收获。

linux内核深度解析_十年磨一剑,第一本龙芯平台的Linux内核书来了相关推荐

  1. 为信息产业自主化而奋斗,第一本龙芯平台的Linux内核书来了!

    十年磨一剑,第一本龙芯平台的Linux内核书来了! 这就是<用"芯"探核:基于龙芯的Linux内核探索解析>--一本基于龙芯平台,结合源代码来探索和解析Linux-5. ...

  2. tesstwo深度优化_十年磨一剑:自主可控国产微观交通仿真软件TESS NG研发之路

    编者按:到目前为止,国内微观交通仿真单位用户已超1000家,主要应用的软件包括德国的VISSIM.SUMO,西班牙的AIMSUN, 美国的TransModeler.SimTraffic,英国的Para ...

  3. 嵌入式Linux驱动大全问世,十年磨一剑,视频!服务!新老客户都有大折扣!

    对于学习嵌入式Linux,韦东山老师整理了三条学习路线,适合与不同阶段的学员. 三条嵌入式学习路线 路线一:单片机路线 使用KEL.HAL库来快速的掌握单片机开发 路线二:深入学习单片机/RTOS/U ...

  4. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第1章 C语言与内存1.1 引言...

    本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第1章,第1.1节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"华章计算机&quo ...

  5. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.4 位运算构建特定二进制数...

    本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第2章,第2.4节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"异步社区" ...

  6. 嵌入式Linux与物联网软件开发:C语言内核深度解析

    嵌入式Linux与物联网软件开发:C语言内核深度解析     1.C语言与内存         1.引言         2.计算机程序运行的目的         3.位.半字.字的概念和内存位宽   ...

  7. 嵌入式 Linux 与物联网软件开发 ——C 语言内核深度解析

    C 语言是嵌入式 Linux 领域的主要开发语言. 对于学习嵌入式.单片机.Linux 驱动开发等技术来说,C 语言是必须要过的一关.C 语言学习的特点是入门容易.深入理解难.精通更是难上加难.很多用 ...

  8. 《C语言内核深度解析》——笔记及拓展(1)

    文章是我前几天读了朱有鹏,张先凤老师的<嵌入式Linux与物联网软件开发:C语言内核深度解析>写的,拜读之后,虽没有醍醐灌顶,至少解开了我之前的一些疑惑. <嵌入式Linux与物联网 ...

  9. Linux正则表达式多个条件并,linux 正则表达式深度解析

    简介 大体来讲,正则表达式的文法分为3种标准:BRE.ERE 和 ARE.其中 BER 和 ERE 属于 POSIX 标准,ARE 则是由各家定义的扩展. POSIX 正则表达式 传统上,POSIX ...

最新文章

  1. xpath 获取当前节点的父节点,兄弟节点的方法
  2. 看完这篇,code review 谁敢喷你代码写的烂?怼回去!
  3. pyinstaller安装以及生成exe文件
  4. docker d盘_windows修改docker的默认存放位置
  5. 访问Mysql数据库,连接字符串配置
  6. java中的类型转换
  7. 大讲堂专访丨连接Oracle DBA与开发的桥梁:Oracle的redo与undo
  8. 使用gulp将文件转码至utf-8格式
  9. WordPress优化:为原创文章和转载文章分别添加不同的版权申明
  10. matlab 数据拟合相关
  11. 常见的SQL优化面试题
  12. 如何把电视盒子做成游戏机? —— 破解电视IPTV盒子(Skyworth E900-S)
  13. 简单做(ZTD)的十个好习惯总结--转
  14. 百度地图开发点连线形成路径
  15. Swift 周报 第十七期
  16. iphone充电图_为什么我的iPhone无法充电?
  17. Activity-的-36-大难点,你会几个?,android游戏开发实践指南
  18. 晚清时真正的武林高手在这儿?
  19. Latex排版论文常见问题
  20. Spark Scala当中reduceByKey(_+_) reduceByKey((x,y) => x+y)的用法

热门文章

  1. 【剑指offer】面试题32 - I:从上到下打印二叉树(Java)
  2. mysql8 修改加密方式_mysql8修改密码加密方式
  3. java去掉mongodb日志_MongoDB日志文件过大的解决方法 清理
  4. rust怎么拆除墙壁指令_人类跌落梦境:城堡怎么过 不少玩家卡在了第六关城堡地图这里...
  5. java实现对大文件切割下载_Java实现大文件的切割与合并操作示例
  6. rust矿洞绳子怎么爬下_rust矿洞绳子怎么爬下_打工小伙爬冰救人,每动一下都能听到冰面碎裂声...
  7. python支持向量机_支持向量机(SVM)Python实现
  8. Java并发编程实战~协程
  9. Java并发编程实战~Thread-Per-Message模式
  10. C++学习之路 | PTA乙级—— 1030 完美数列 (25 分)(精简)