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

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

3db4f93b2cc86d57207f7f4e26b28a51.png

市面上解析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。

ad6e04e879423c077c0c8e5412986034.png

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

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

ac30a3c08f78d96711bba5b7f9c18105.png

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

这本书选择了哪些内容?

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

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

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

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

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

c2fb528cc782257d19b591543089a11e.png

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

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

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

cce7f13c6034d1afeaa1627f3dcd7148.png

(树形视图)

2f4b7f8bf128d6e9b3498671707f2fd9.png

(链式视图)

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

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

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

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

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

fd9bfacebbcdc2f64126bfb538622703.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器能记录远程访问用户嘛,bat记录远程桌面连接登录信息

1.记录远程桌面的连接登录日志方法::RDPlog.bat:hu 20110201:记录登陆信息echo offset mnetstat -nfor /f "tokens4 delims: " %%i in (%m%^|find "3389") do set mstsc%%iecho %date% %time:~0,-3% %USERNAME% %mstsc% >> RDPlog.txt…

【LeetCode笔记】27. 移除元素(Java、原地)

文章目录题目描述思路 & 代码更新版题目描述 打卡每日~感觉和昨天的每日基本上一样,甚至还更简单(简单题我重拳出击!) 思路 & 代码 就是维护一个 nowLen,再遍历一次即可。 class Solution {pu…

【LeetCode笔记】124. 二叉树中的最大路径和(Java、二叉树、DFS)

文章目录题目描述思路 & 代码更新版题目描述 好家伙我可太激动了,第一次光速A困难题。应该是因为写过类似的二叉树的直径,不过这道倒是属于简单题。。面试常考题,刷codetop看到了就写写 思路 & 代码 递归过程是自底向上的递归过程…

jupyternotebook虚拟环境无法连接服务_详解pycharm连接远程linux服务器的虚拟环境的方法_python...

这篇文章主要介绍了pycharm连接远程linux服务器的虚拟环境的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下一、前提条件1、确保linux服务器已经安装好虚拟环境,并且虚…

【LeetCode笔记】4. 寻找两个正序数组的中位数(Java、二分、递归)

文章目录题目描述思路 & 代码题目描述 算是拖了好久的题目 ,一开始刷的时候没打算直接冲困难不过面试常客了,还是得冲掉,而且不能留下心魔嘛!难点在于实现时间复杂度 O(log(m n)),显而易见得用二分法 思路 &a…

梦幻西游服务器每周几维护,梦幻西游5月6日维护公告:唯美版地图不再更新

为保证服务器的运行稳定和服务质量,《梦幻西游2》所有服务器将于2014年5月6日上午8:00停机,进行每周例行的维护工作。预计维护时间为上午8:00~9:30。如果在预定时间内无法完成维护内容,开机时间也将继续顺延。请各位玩家相互转告&…

浏览器市场占有率_全球市场占有率第一的谷歌浏览器添加对ipfs://的支持!

欢迎来到IPFS周报!👋星际文件系统(IPFS)是一种新的超媒体分布式协议,基于内容和身份的寻址。IPFS支持创建完全分布式应用程序。它旨在使网络更快,更安全,更开放。由于这是一个非常大的项目,我们在每期周报中…

win10 系统地图无法定位服务器,图文修复win10系统无法打开定位服务的详细技巧...

有很多网友在使用电脑的过程总难免会遇到win10系统无法打开定位服务的情况。尽管处理方法特别的容易,可是也有很多朋友不知道win10系统无法打开定位服务究竟要怎么处理。我就给大家整理总结了win10系统无法打开定位服务的解决方法,解决起来也不难&#x…

【LeetCode笔记】41. 缺失的第一个正数(Java、哈希)

文章目录题目描述思路 & 代码题目描述 难点在于时空复杂度的要求想出最优方法,需要认真理解题目。 思路 & 代码 做法:建立一个逻辑上的哈希表,令 nums[i] i 1,比如 nums[0] 1。那么第一个不符合这个要求的元素的下…

笔记本电脑如何保养_电脑保养只是吹一吹?别再被骗了,电脑没做这些就等于没保养...

汽车大约跑5000KM就需要保养一次,电脑与汽车一样,在使用一定时间的时候也需要保养一次,电脑保养对于很多朋友来说还是很陌生的,在这里小编就给大家做一个简单的科普,电脑保养主要指的是清理灰尘与更换硅脂,…

【LeetCode笔记】199. 二叉树的右视图(Java、二叉树、层序遍历)

文章目录题目描述思路 & 代码题目描述 挺简单的,直接看思路代码吧。 思路 & 代码 就是一个层序遍历,取每层的最右边结点即可 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* T…

ibm笔记本电脑电池_笔记本电池怎么充电 笔记本电脑电池充电方法【详解】

笔记本电脑以其精致小巧的外形、方便携带的特点,受到了众多人士的喜爱。在 办公室 没有完成的工作,可以随时带到家中去完成,它的存在就是为了我们能有便捷的办公模式。那么对于这个日夜陪伴我们的好物件大家都是怎么充电的呢?方法…

电脑键盘下划线怎么打_图文详解笔记本电脑键盘失灵怎么办

相信有很多朋友都遇到过笔记本键盘失灵的情况,其实笔记本键盘失灵的问题是可大可小的,下面小编就给大家详细介绍关于怎么解决笔记本电脑失灵的操作方法,让大家在遇到问题时自己就能够解决这些问题。方法一。1。右键单击桌面右下角的输入方法&…

【LeetCode笔记】69. x 的平方根(Java、二分)

文章目录题目描述思路 & 代码更新版题目描述 本质&#xff1a;找满足 k * k < x 的最大 k 思路 & 代码 二分&#xff0c;对满足 k * k < x 的最大 k进行查找。注意极端数据&#xff0c;用 long暴力法先来一个 class Solution {public int mySqrt(int x) {in…

opencv 模板匹配_详细剖析模板匹配

点击上方“新机器视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达模板匹配介绍我们需要2幅图像&#xff1a;原图像 (I): 在这幅图像里,我们希望找到一块和模板匹配的区域模板 (T): 将和原图像比照的图像块模板匹配就是在整个图像区域发现…

【LeetCode笔记】143. 重排链表(Java、链表、栈、快慢指针)

文章目录题目描述思路 & 代码更新版&#xff1a;快慢指针 翻转链表题目描述 一看题目反序&#xff1a;用栈更新&#xff1a;O(1) 空间复杂度 思路 & 代码 先快慢指针&#xff0c;找到需要入栈的起点&#xff0c;然后逐个入栈然后逐个出栈&#xff0c;进行重排即可…

hdfs中与file数组类似的数组_如何在 JavaScript 中克隆数组

作者&#xff1a;Yazeed Bzadough译者&#xff1a;allenJavaScript 有很多方法可以做任何事情&#xff0c;现在我们研究数组。1.扩展运算符(浅拷贝)自从 ES6 发布以来&#xff0c;这一直是最受欢迎的方法。这是一个简短的语法&#xff0c;你会发现它在使用像 React 和 Redux 这…

【LeetCode笔记】54. 螺旋矩阵(Java、迭代、递归)

文章目录题目描述思路 & 代码递归迭代更新版 - 递归题目描述 递归和迭代都实现了&#xff0c;递归相对比较好理解&#xff0c;也比较好实现 思路 & 代码 递归 每次都把最外圈的元素跑完一行 or 一列的时候&#xff0c;跑一次结束边界&#xff1a;left > right …

ubuntu boot空间不足_安装 Ubuntu 双系统

在很久以前就想试一试Linux了&#xff0c;一直没有实践。一是觉得太麻烦&#xff0c;二是怕把电脑弄坏。后来实践了一次后发现&#xff0c;其实并没有想象中那么难&#xff0c;这是一个完全独立的系统&#xff0c;与隔壁的Windows半毛钱关系都没有。把引导搞定就不怕了。另外&a…

【LeetCode笔记】112 113. 路径总和 I II(Java、递归、DFS)

文章目录路径总和 I路径总和 II比较简单&#xff0c;就连着一起写了 路径总和 I 注意&#xff1a;一定得走到叶子才算 直接看代码吧&#xff0c;注释也就几行。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* T…