Linux内核这么复杂,我该如何学习?

2023-10-19 15:50

本文主要是介绍Linux内核这么复杂,我该如何学习?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、首先我们要明白Linux重要性

其实大家每时每刻都在使用着Linux系统,不过,你们对此并不知情而已。可以说Linux已经成为了我们生活中的一个基础,比如飞机的控制系统、银行的系统、手机的系统等等,你可以想象下没有以上的东西我们的生活将会怎么样,我们的生活、资金和生命都掌握在linux手中,它能够让我们生存,同样,它也可以让我们灭亡,所以Linux的重要性几乎令人难是置信,没有Linux的世界可能将会截然不同,或许,这样的世界会暗然失色,一片漆黑,而Linux将是那种世界不会继续存在的理由。

2、我们如何学习呢?

2.1 环境(准备工作)

一开始很多人问用什么linux发行版好呢?其实都差不多,知识点大部分都是一样,我一开始用的是redhat感觉很好的,当然也可以用Ubuntu或者其他的发行版都是可以的。
需要掌握Linux基础知识。例如,Linux命令、磁盘管理、用户管理、文件权限等,强烈推荐大家阅读网友总结的《Linux入门学习笔记》。

2.2 Linux内核组成以及源码组织结构

Linux内核主要由进程管理、内存管理、设备驱动、文件系统、网络协议栈外加一个系统调用。
image.png
源码组织结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Fq5xDdh-1627907769813)(https://pic.leetcode-cn.com/1627906276-WUJAJY-image.png)]

2.3 清楚Linux内核每个模块里包含了哪些

image.png

内存管理

  • 内存管理
    • SMP/NUMA模型组织
    • 页表/页表缓存
    • CPU缓存
    • 内存映射
  • 虚拟内存
    • 伙伴分配器
    • 块分配器
    • 巨型页
    • 页回收
    • 页错误异常处理与反碎片技术
    • 连续内存分配器技术原理
    • 不连续页分配器原理与实现
  • 内存系统调用
    • kmalloc/vmalloc
    • 内存池原理与实现
    • 内存优化与实现

文件系统

  • 虚拟文件系统VFS
    • 通用文件模型
    • 数据结构
    • 文件系统调用
    • 挂载文件系统
    • 无存储文件系统
  • 磁盘文件系统
    • Ext2/Ext3/Ext4文件系统
    • 日志JBD2
  • 用户空间系统
    • FUSE原理机制/接口与实现

进程管理

  • 进程基础
    • 进程原理及状态
    • 生命周期及系统调用
    • task_struct数据结构
  • 进程调度
    • 调度策略
    • 进程优先级
    • 调度类分析
    • SMP调度

网络协议栈

  • 网络基础架构
    • SKB/net_device
    • 网络层分析
    • Linux邻近子系统
    • netlink套接字
    • iptables套接字
    • netfilter框架
    • 内核NIC接口分析
    • mac80211无线子系统
  • 网络协议栈
    • internet控制消息协议(ICMP)
    • 用户数据报协议(UDP)
    • 传输控制协议(TCP)
    • 流控制传输协议(SCTP)
    • 数据报拥塞控制协议(DCCP)
    • IPv4路由选择子系统*
    • 组播/策略/多路径路由选择
    • 接收/发送(IPv4/IPv6)数据报
    • infiniBand栈的架构
  • 系统API调用
    • POSIX网络API调用
    • epoll内核原理与实现
    • 网络系统参数配置

设备驱动

  • 设备子系统
    • I/O机制原理
    • 设备模型
    • 字符设备子系统
    • 网络接口卡驱动
  • Linux设备模型
    • LDM
    • 设备模型和sysfs
  • 字符设备驱动
    • 主设备与次设备
    • 设备文件操作
    • 分配与注册字符设备
    • 写文件操作实现
  • 网卡设备驱动
    • 数据结构
    • 设备方法
    • 驱动程序
  • 块设备驱动
    • 资源管理
    • I/O调度
    • BIO结构原理
    • PCI总线原理
  • 蓝牙子系统
    • HCI层/连接
    • L2CAP
    • BNEP
    • 蓝牙数据包接收架构

2.4 清楚哪些内容后,开始针对每个模块的知识点,系统的学习。

书籍推荐

《Linux内核完全注释V3.0书签版》

《Linux命令行大全 - 绍茨 (william E.shotts)》

《Linux命令速查手册》

《Linux就该这么学》

《Linux性能优化大师》

《Linux环境编程:从应用到内核》

《Linux集群和自动化运维 余洪春》

《Linux驱动程序开发实例(第2版)》

《Linux高级程序设计(第3版)》

《构建高可用Linux服务器(第4版)》

《深入了解Linux内核》

我要根据自己的实际情况,挑选合适的书籍。例如自己是运维方面的,可以阅读《Linux集群和自动化运维 余洪春》、或者自己是想往Linux C/C++服务器开发的可以阅读《深入了解Linux内核》等等。

阅读文章

在学习的时候肯定会遇到一些书本内容难以理解等,这个时候我们需要借鉴一些大神的优秀文章,来帮助自己的掌握知识。
0voice-linux_kernel_wiki-linux内核学习资料:200-经典内核文章,100-内核论文,50-内核项目,500-内核面试题,80-内核视频.png

视频学习
在学习的时候,视频往往比文字资料来得更有效果。

1、Linux Kernel Network Drivers - Classification(Linux内核网络驱动程序)百度网盘:qdt5

2、Linux Kernel Development(Linux内核开发)百度网盘:vg1u

3、The mind behind Linux(Linux背后的思想)百度网盘:zgnu

4、Linux Systems Performance(Linux系统性能)百度网盘:9qom

5、Network Driver Interfaces(网络驱动程序接口)百度网盘:xpke

6、Selective module compilation in mainline kernel(在主线内核中编译可选模块):百度网盘:l56j

7、Linux System Programming 6 Hours Course(Linux系统编程6小时课程)百度网盘:hc2d

8、Threads and Thread Handing(线程和线程处理)百度网盘:erxm

9、Learning the Linux Kernel with tracing(通过跟踪学习Linux内核)百度网盘:066g

10、How to Apply a Patch to the Linux Kernel Stable Tree(如何将补丁应用到Linux内核稳定树)百度网盘:955e

11、Linux Kernel Programming(Linux内核编程- atomic_t数据类型-原子变量和api)百度网盘:njt0

12、Kernel Recipes 2017 - 性能优化大牛Brendan Gregg 百度网盘:lrex

内核项目
这些工具,也许能更好帮助我们学习、生产。
在这里插入图片描述

大佬论文
image.png

2.5 熟读面试题

面试题往往能体现出这个体系里的重点知识,所以我们有必要阅读下面试题。如果自己正想找Linux相关你面试岗位,更加应该看看。
image.png

总结

无论我们学习哪个知识,我们应该有章法、有计划、更加应该要有方法,这样的才能学好, 学透。当然,还要勤奋,我们做程序员的,本来就应该多敲代码,多思考。

image.png

文章资源来源于Github项目,感兴趣的小伙伴可以去star、fork一下:Linux内核学习资料

这篇关于Linux内核这么复杂,我该如何学习?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/240797

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]