Linux专业分享篇:带你们了解Linux系统内核,以及我的日常调试方法~

2021/11/25 7:10:22

本文主要是介绍Linux专业分享篇:带你们了解Linux系统内核,以及我的日常调试方法~,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Linux 内核已经有三十年的历史了(1991-2021),一开始只有不到一万的代码到现在几千万的代码,不得不佩服人类的智慧了!
今天跟大家讲讲Linux内核,在运用的过程中遇到的BUG该如何进行调试!
在这里插入图片描述

接触过Linux的都知道Kernel的含义,在我看来就是操作系统的核心或者最重要的部分。众所周知的是,几乎整个互联网都运行在 Linux上,从网络协议,到服务器,到你平常访问的绝大多数网站,都能看到它的身影,Linux 内核就是最复杂最流行的开源项目之一。如果你希望学习内核知识,在网上可以搜到无数的资料,但是Kernel真的是一个非常复杂的项目,从广义上来讲Kernel就是一个软件,它在硬件和软件之间提供了一个层,严格地从计算机科学的角度讲,Linux中所指的Kernel是Linus Torvalds在90年代初期写的那些代码。
在这里插入图片描述
接下来给大家放一张图,接触Linux的朋友应该都了解过,对于刚踏入行业的朋友来说,这也是极大地提高自己的学习效率。
在 Linux 内核中,有许多层次、模块、功能调用和函数。要把其中的每一块儿都弄明白是很不容易的,不过MakeLinux做了一个非常酷的完整的内核交互图,上面非常清晰地标注了每一个组件部分及之间的关系,这张Linux内核交互图可以很好的帮助你不用一一细读 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语言有所了解,也可以买相关书籍进行浏览,或者关注我,有问题也可以问老师!

(点击下载Linux内核资料,加入我们吧)

纸上得来终觉浅,绝知此事要躬行。只看书是绝对不行的,一定要结合课本给出的编程建议自己敲代码。刚开始就以模块形式测试好了,或者自己编译一个开发版本的内核。一台机器的话,使用UML方式调试,内核控制路走到哪一步,单步调试看看程序执行过程,比书上的讲解更直观明了。一定要动手实际操作。
在这里插入图片描述
除了要了解Linux系统,还要熟悉vim和git等工具。
在Linux上做一些编程和调试的练习,如使用QEMU+GDB+Eclipse来调试内核,熟悉GDB等。
说到调试,其实是很多人遇到过的问题,当自己遇上一个BUG的时候,可能调试了一年半载都解决不了,不用灰心,这也是一种好事,意味着自己平时写代码的时候要多看点书,或者多认识一些资深的牛人。因为自己也是亲身经历者,在一些群里也会经常问一些老师们问题,他们也都能很好的解决,如有需要可以一起加入上车!

Linux专业讲解分享,点我下载添加

话说回来,调试BUG的时候最好是不要做实验,抱着先试一下的态度。我认为最好先是理清自己的思路!
我的解决思路一般是这样子的:理解问题>重现问题>定位问题,找到问题代码>尝试修复问题>如果失败了重回第一步!
在这里插入图片描述
而我们常见的BUG分为这些:
Crash,最常遇到的,可能是因为我是做设备驱动开发的缘故;
Lockup,比较少,这类问题预防比事后调试更重要;
Logic/implementation error,这个也比较容易遇到,一般是运行不报错,但是运行的结果不符合预期;
Resource leak,偶尔会遇到;
Performance,偶尔会遇到,对于做驱动开发的话,一般是先考虑功能,当性能达不到要求时,再考虑优化性能。

在这里插入图片描述
至于我是怎么进行调试的呢,我大致分为这几类:
1、很多人不知道,调试最重要的工具是:我们的大脑。换句话说,也就是我们对内核个子系统、驱动开发的理解;
2、Logs and dump analysis。内核很贴心,许多异常发生时都会有一堆的 Kernel Panic 的信息,经常能让我们直接定位到引起异常的代码;
3、Tracing/profiling。这类工具一般能让我们理解程序的运行流程,不仅适合用来调试问题,也适合用来学习和理解内核的各种功能实现。
4、Interactive debugging。主要就是 gdb,我个人用得很少。
5、Debugging frameworks。许多的调试工具经过不断地发展和完善后,就慢慢地形成了一整套的调试框架,例如 Ftrace、SystemTap
在这里插入图片描述
学习内核,每个人都有自己的学习方法,仁者见仁智者见智。以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下。



这篇关于Linux专业分享篇:带你们了解Linux系统内核,以及我的日常调试方法~的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程