前辈经验分享:带你们了解Linux系统内核,以及我的日常调试方法

Linux 内核已经有三十年的历史了(1991-2021),一开始只有不到一万的代码到现在几千万的代码,不得不佩服人类的智慧了!

视频教程推荐:

【全网独家】高薪岗位DPDK高性能虚拟专家学习路线

【备战秋招】C/C++程序员可以安心躺平的音视频流媒体开发

【鹅厂T8认证】2022年LinuxC/C++后台开发最强学习路线图

【备战秋招】互联网大厂秋招,嵌入式从入门到精通(小白零基础速学)

今天跟大家讲讲Linux内核,在运用的过程中遇到的BUG该如何进行调试!
在这里插入图片描述
接触过Linux的都知道Kernel的含义,在我看来就是操作系统的核心或者最重要的部分。众所周知的是,几乎整个互联网都运行在 Linux上,从网络协议,到服务器,到你平常访问的绝大多数网站,都能看到它的身影,Linux 内核就是最复杂最流行的开源项目之一。如果你希望学习内核知识,在网上可以搜到无数的资料,但是Kernel真的是一个非常复杂的项目,从广义上来讲Kernel就是一个软件,它在硬件和软件之间提供了一个层,严格地从计算机科学的角度讲,Linux中所指的Kernel是Linus Torvalds在90年代初期写的那些代码。最新Linux内核资料+视频教程

接下来给大家放一张图,接触Linux的朋友应该都了解过,对于刚踏入行业的朋友来说,这也是极大地提高自己的学习效率。

在 Linux 内核中,有许多层次、模块、功能调用和函数。要把其中的每一块儿都弄明白是很不容易的,不过MakeLinux做了一个非常酷的完整的内核交互图,上面非常清晰地标注了每一个组件部分及之间的关系,这张Linux内核交互图可以很好的帮助你不用一一细读 Linux 内核代码,就能弄明白各个内核子系统间复杂的内部联系。
在这里插入图片描述
这张图上包含有超过400个关键函数,这400个关键函数被分进了一些主要的子系统,彼此之间的关系用连线标明了,交互地图在这里
在这里插入图片描述
在这里插入图片描述
对于想要了解Linux的朋友们,我用房子来打个比方,通俗易懂些,软件是上层建筑,也就是我们现在住的房子,房子下面的地基就是系统调用层,而上层建筑只要根据地面地基从而规划就行了,也不用大致管地基里面是什么样子。

Linux大体来说是可以分为三个部分的:

硬件层:包括cpu、物理内存、主板、磁盘和相应的外设。

内核空间:包括Linux内核的核心部件,比如arch抽象层、设备管理抽象层、内存管理、进程管理、总线管理、字符设备以及应用程序交互系统调用层

用户空间:这里包括c语言库、应用程序和虚拟机等。

在这里插入图片描述
那我们先关注一些主要的部件。

system calls(系统调用层)

把系统想成一个大楼,调用层是地基平面,用户层就建立在上面,用户是不关心地基里面怎么运行的。比如编写用户进程的程序员不需要知道这个文件具体存放在磁盘哪个扇区里,只需要调用open()、read()、mmap()等函数就可以。

(2) 进程管理

进程是现在操作系统中非常重要的概念,包括上下文切换以及进程调度。每个进程运行时都感觉完全占有了全部的硬件资源。但是进程不会长时间占有硬件资源。操作系统利用进程调度器让多个进程并发执行。

进程管理还包括进程的创建和销毁、线程组管理、内核线程管理、队列等内容。

(3) 内存管理

内存管理是Linux内核中最复杂的模块,它涉及了虚拟内存和物理内存的管理。作为Linux系统,Linux内核的虚拟内存管理非常重要。虚拟内存有很多优点,比如多个进程可以并发执行、进程请求的内存可以比物理内存大、多个进程可以共享函数库等,因此虚拟内存越来越复杂了。

物理内存的管理也比较复杂。页面分配器是核心部件,它需要考虑系统内存紧张时候,如何回收页面和继续分配物理内存。

(4) 文件系统

为多种文件系统提供统一的操作接口,当然有各种各样的文件系统,比如ext4和XFS等。为了支持各种各样的文件系统,Linux虚拟机出一个称为虚拟文件系统(VFS),这样linux内核就可以很方便的集成多种文件系统。

对于Linux的内核该如何进行学习呢?

我认为学习Linux内核的话,最好对C语言有所了解,也可以买相关书籍进行浏览,或者关注我,有问题也可以问老师!

纸上得来终觉浅,绝知此事要躬行。只看书是绝对不行的,一定要结合课本给出的编程建议自己敲代码。刚开始就以模块形式测试好了,或者自己编译一个开发版本的内核。一台机器的话,使用UML方式调试,内核控制路走到哪一步,单步调试看看程序执行过程,比书上的讲解更直观明了。一定要动手实际操作。
在这里插入图片描述
在这里插入图片描述
而我们常见的BUG分为这些:

l Crash,最常遇到的,可能是因为我是做设备驱动开发的缘故;

l Lockup,比较少,这类问题预防比事后调试更重要;

l Logic/implementation error,这个也比较容易遇到,一般是运行不报错,但是运行的结果不符合预期;

l Resource leak,偶尔会遇到;

l Performance,偶尔会遇到,对于做驱动开发的话,一般是先考虑功能,当性能达不到要求时,再考虑优化性能。

在这里插入图片描述
至于我是怎么进行调试的呢,我大致分为这几类:

1、很多人不知道,调试最重要的工具是:我们的大脑。换句话说,也就是我们对内核个子系统、驱动开发的理解;

2、Logs and dump analysis。内核很贴心,许多异常发生时都会有一堆的 Kernel Panic 的信息,经常能让我们直接定位到引起异常的代码;

3、Tracing/profiling。这类工具一般能让我们理解程序的运行流程,不仅适合用来调试问题,也适合用来学习和理解内核的各种功能实现。

4、Interactive debugging。主要就是 gdb,我个人用得很少。

5、Debugging frameworks。许多的调试工具经过不断地发展和完善后,就慢慢地形成了一整套的调试框架,例如 Ftrace、SystemTap

在这里插入图片描述
学习内核,每个人都有自己的学习方法,仁者见仁智者见智。以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简说Linux内核

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值