我的Linux内核学习笔记

在开始今天的内容之前,其实有一些题外话可以和大家分享一下。自从工作以来,我个人一直都有一个观点。那就是怎么样利用简单的代码来说明开发中的问题,或者是解释软件中的原理,这是一个很高的学问。有些道理看上去云里雾里说不清楚,其实都可以通过编写代码来验证的.os可以、cpu可以、cache可以、编译器可以、网络协议也可以,很多很多的内容完全可以通过几行代码就可以表达得非常清楚,但是事实上我们并没有这么做。

我想原因无非是这么几条,

一来授业者对相关知识的学习也是停留在概念上而已;

二来我们的学习过于死板和教条、太关注知识、不求实践;

三就是学习者自身缺少思考的能力、缺少自我反省的能力、对很多东西不求甚解。

而学习Linux内核就能很好的帮助我们解决这些问题。

Linux内核学习路线:

以网络协议栈为例:

1、Linux内核源代码结构

Linux 的内核源代码可以从 https://www.kernel.org/网站上下载,Linux-4.1.2以上的版本(含)。  其代码目录结构如下:

  • Documentation:这个目录下面没有内核的代码,有一套有用的内核文档。其中文档质量良莠不齐,有很多内核文档的质量很优秀并且相当完整,例如文件系统;但是有的则完全没有文档,例如进程调度。在这个目录里不时可以发现有用的东西。

  • arch:此目录下的所有子目录的东西都是体系结构特有的代码。

  • drivers:内核的驱动程序代码。此部分的代码占内核代码的大部分,包括显卡、网卡、PCI 等外围设备的驱动代码。

  • fs:文件系统代码。包含 ext2、ext3、ext4 等本地文件系统,CD-ROM、isofs 等镜像系统,还有 NFS 等网络文件系统,以及 proc 等伪文件系统。

  • include:此目录中包含了 Linux 内核中的大部分头(*.h)文件。

  • init:内核初始化过程的代码。

  • ipc:进程间通信代码。

  • kernel:这部分是 Linux 内核中最重要的,包含了内核中平台无关的基本功能,主要包含进程创建、销毁和调度的代码。

  • lib:此目录中主要包含内核中其他模块使用的通用函数和内核自解压的函数。

  • mm:此目录中的代码实现了平台无关的内存管理代码。

  • scripts:此目录下是内核配置时使用的脚本,当使用 make menuconfig 或者 make xconfig 命令时,会调用此部分代码。

  • net:此目录中包含 Linux 内核的网络协议栈的代码。在子目录 netfilter 下为 netfilter的实现代码,netfilter 构建了一个框架,允许在不重新编译内核的情况下,编写可加载内核,在指定的地方插入回调函数,以用户自己的方式处理网络数据。子目录 ipv4 和 ipv6 为 TCP/IP 协议栈的 IPv4 和 IPv6 的实现,主要包含了 TCP、UDP、IP 协议的代码,还有 ARP 协议、ICMP 协议、IGMP 协议、netfilter 的 TCP/IP 实现等代码实现,以及如 proc、ioctl 等控制相关的代码。

组织代码另一个表现形式就是映射到Linux代码的3个内核层:

2、内核中网络剖析流程

网络协议栈是由若干个层组成的,网络数据的流程主要是指在协议栈的各个层之间的传递。在前面章节中TCP 网络编程的流程,一个 TCP 服务器的流程按照建立 socket()函数,绑定地址端口 bind()函数,侦听端口 listen()函数,接收连接 accept()函数,发送数据send()函数,接收数据 recv()函数,关闭 socket()函数的顺序来进行。与此对应内核的处理过程也是按照此顺序进行的,网络数据在内核中的处理过程主要是在网卡和协议栈之间进行:从网卡接收数据,交给协议栈处理;协议栈将需要发送的数据通过网络发出去。


如下图所示,总结了各层间在网络输入输出时的层间调用关系。由图中可以看出,数据的流向主要有两种。应用层输出数据时,数据按照自上而下的顺序,依次通过插口层、协议层和接口层;当有数据到达的时候,自下而上依次通过接口层、协议层和插口层的方式,在内核层传递。

应用层 Socket 的初始化、绑定(bind)和销毁是通过调用内核层的 socket()函数进行资源的申请和销毁的。发送数据的时候,将数据由插口层传递给协议层,协议层在 UDP 层添加 UDP 的首部、TCP 层添加 TCP 的首部、IP 层添加 IP 的首部,接口层的网卡则添加以太网相关的信息后,通过网卡的发送程序发送到网络上。        

接收数据的过程是一个相反的过程,当有数据到来的时候,网卡的中断处理程序将数据从以太网网卡的 FIFO 对列中接收到内核,传递给协议层,协议层在 IP 层剥离 IP 的首部、UDP 层剥离 UDP 的首部、TCP 层剥离 TCP 的首部后传递给插口层,插口层查询 socket 的标识后,将数据送给用户层匹配的 socket。

如下图所示为 Linux 内核层的网络协议栈的架构视图。最上面是用户空间层,应用层的程序位于此处。最底部是物理设备,例如以太网网卡等,提供网络数据的连接、收发。中间是内核层,即网络协议栈子系统。流经网络栈内部的是 socket 缓冲区(由结构 sk_buffs接连),它负责在源和汇点之间传递报文数据。

顶部(参见上图所示)是系统调用接口,它为用户空间的应用程序提供了一种访问内核网络子系统的接口。位于其下面的是一个协议无关层,它提供了一种通用方法来使用底层传输层协议。然后是实际协议,在 Linux 中包括内嵌的协议 TCP、UDP,当然还有 IP。然后是另外一个网络设备协议无关层,提供了与各个设备驱动程序通信的通用接口,最下面是设备驱动程序本身。

             ·····························


而这些内核笔记就是我给大家推荐的《Linux内核内存管理》训练营的随堂笔记,对内核的每一块技术进行抽丝剥茧的分析。

????学习三部曲

1. 扫描上图????二维码报名训练营;

2.详情页添加老师领取课前预习资料;

3.晚上八点准时参与直播。


训练营能解决我们Linux内核学习中的哪些问题?

1.大块内核内存怎么样分配?
2.伙伴系统如何申请内核内存?
3.slab分配器如何申请内核内存的?
4.vmalloc()申请的内存有什么特点?
5.用户程序使用malloc()申请到的内存空间在什么范围?
6.TLB中缓存的是什么内容?
7.虚拟内存如何组织的?
8.缺页机制是如何实现?


最后再提醒下,训练营限时特惠!

今天到手价0.02,原价198

课程永久有效,优惠就这两天,抓紧!

训练营课前预习资料包:

添加秋香小姐姐 立即领取

点击“阅读原文”课前预习资料提前领

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

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

相关文章

10 文件无效_新手必看!10个CAD常见问题解决技巧

对于很多刚接触CAD的萌新来说,学习过程遇到的问题总是很多。如果没有老师解答的话,上百度搜索也常常不得要领,所以今天为大家做了大概的问题总结,主要是以下几个问题:1多线段合并A.输入命令“PE”B&#xf…

TurboMail手机客户端—强大的附件文档阅读能力

2019独角兽企业重金招聘Python工程师标准>>> 对于频繁使用邮件的用户而言,收发附件已是家常便饭,但对于手机查看附件,用户却遇到了很多问题。稍微低端的手机,除了txt格式的文本,基本上其他格式的文档&#…

连不上机器判断机器状态_如何准确估计机器人的状态,增强机器人控制的精度及稳定性...

在机器人学中,状态估计和控制一样,是无法避开的问题。 任何传感器的精度都是有限的,如何利用传感器信息,尽可能准确地估计一组完整描述机器人随时间运动的物理量,如位置、速度、加速度、角度、角速度等,是状…

2个字符串相等 swift_Swift快速入门(一)之 Swift基础语法

Swift快速入门(一)之 Swift基础语法近期重新学习了一遍Swift语言,主要以《Swift编程权威指南(第2版)》为教程,学习过程中结合比对Java语言特性将学习心得作为三篇笔记:Swift基础语法&#xff0c…

bootstrap switch只出现一个对号_python:34.第一个只出现一次的字符位置

题目描述在一个字符串(0<字符串长度<10000&#xff0c;全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1&#xff08;需要区分大小写&#xff09;.解析暴力解法&#xff0c;时间复杂度是 。# -*- coding:utf-8 -*- class Solution:def Fi…

mac系统如何进入系统偏好设置_MacOS Big Sur 系统偏好设置无法解锁Bug解决

前不久&#xff0c;MacOS推送正式版Big Sur&#xff0c;我满怀期待的更新。更新的过程很平缓&#xff0c;一切都很顺利。但在使用时&#xff0c;出现了一个问题&#xff0c;系统偏好设置的锁无法解除&#xff0c;导致有些软件需要权限&#xff0c;却不能正常允许通过&#xff0…

事务嵌套问题_注意Spring事务这一点,避免出现大事务

背景本篇文章主要分享压测的(高并发)时候发现的一些问题。之前的两篇文章已经讲述了在高并发的情况下&#xff0c;消息队列和数据库连接池的一些总结和优化&#xff0c;有兴趣的可以在我的公众号中去翻阅。废话不多说&#xff0c;进入正题。事务&#xff0c;想必各位CRUD之王对…

多布局怎么搭建_怎么制作网页?网页制作基本步骤

怎么制作网页?网页制作基本步骤&#xff0c;互联网时代&#xff0c;各行各业的企业为了适应时代的发展&#xff0c;纷纷从线下转移至线上来拓展自己的业务。若想让更多人了解自己的企业&#xff0c;拥有一个专属网站至关重要。网站不仅可以详细介绍企业信息&#xff0c;更重要…

能运行shell吗_terminal, shell, bash, zsh

##秋天的第一杯奶茶梗?Terminal: shell运行在里面。A terminal refers to a wrapper program that runs a shell.Shell:The shell is the program that actually processes commands and returns outputs. Most shells also manage foreground and background processes, comm…

OSPF的虚链路配置

OSPF的虚链路配置<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />OSPF多区要求普通区域必须和骨干区域&#xff08;area 0&#xff09;相连&#xff0c;如果一个区域不能和骨干区域直接相连&#xff0c;可以使用虚链路把该区域逻…

webmvcconfigurer配置跨域_为什么加了 Spring Security 会导致 Spring Boot 跨域失效呢?...

点击上方 IT牧场 &#xff0c;选择 置顶或者星标技术干货每日送达作者&#xff1a;欧阳我去链接&#xff1a;https://segmentfault.com/a/1190000019485883作为一个后端开发&#xff0c;我们经常遇到的一个问题就是需要配置 CORS&#xff0c;好让我们的前端能够访问到我们的 AP…

[jQuery]3D效果的标签云

刚才看了篇园友关于如何自定义标签云的文章&#xff0c;心痒痒自己也想弄一个&#xff0c;其实原理非常简单&#xff0c;就是动态load标签页里的标签&#xff0c;按需要的格式重新动态生成DOM结构&#xff0c;再通过第三方的js插件(他们用的是Google Visualization API Gallery…

1071svm函数 r语言_R语言机器学习之核心包e1071 - 数据分析

R语言有很多包可以做机器学习(Machine Learning)的任务。机器学习的任务主要有有监督的学习方式和无监督的学习方式。有监督学习&#xff1a;在正确结果指导下的学习方式&#xff0c;若是正确结果是定性的&#xff0c;属于分类问题&#xff1b;若正确结果是定量的&#xff0c;属…

重装系统失败后怎么用好系统U盘启动解决?

很多朋友在第一次重装电脑系统时都会出现这样或那样的错误&#xff0c;导致重装系统后进不去系统&#xff0c;非常的被动。那么当我们遇到这种情况该怎么办呢&#xff1f;其实我们可以使用好系统U盘启动来解决重装系统后进不去的问题。 好系统U盘启动解决重装系统后进不去的方法…

MEncoder 使用实例

MEncoder 是一个简单的影片编码程序&#xff0c;它可用于将视频或者音频文件在 MPlayer 可播放的格式当中互相转换。说到 MEncoder 就不得不知道 MPlayer。MPlayer 是一款为 Linux 编写的电影播放器。它能播放大部分 XAnim、RealPlayer 以及 Win32 DLL 支持的 MPEG、VOB、AVI、…

div为空的时候 浮动没有效果_3种CSS清除浮动的方法

点击上方 "前端技术精选" 关注&#xff0c;星标或者置顶12点00分准时推送&#xff0c;第一时间送达作者&#xff1a;html中文网 | 编辑&#xff1a;前端妹来源&#xff1a;html.cn/web/css/19613.html前端技术精选(ID&#xff1a;FrontEndTech)第 55 次推文 图源&…

3. 中间件安全基础(三)

0x00 前言 前两篇文章我们对六款中间件的基本信息和相关的安全配置做了介绍&#xff0c;这篇文章我们主要就中间件常见的漏洞利用方式及修复方法做出讲解。如果某些地方存在疑问可以对比着前两篇文章阅读&#xff0c;更好地加深理解。 0x01 Apache 解析漏洞是指非程序文件被异常…

php mysql 删除语句怎么写_php mysql 删除语句是什么

php mysql删除语句是Delete&#xff0c;DELETE语句用于从数据库表中删除行&#xff0c;其语法是“DELETE FROM table_name WHERE some_column some_value”。PHP MySQL DeleteDELETE 语句用于从数据库表中删除行。删除数据库中的数据DELETE FROM 语句用于从数据库表中删除记录…

mysql数据排序指令_MySQL 排序 | 菜鸟教程

MySQL 排序我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。如果我们需要对读取的数据进行排序&#xff0c;我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序&#xff0c;再返回搜索结果。语法以下是 SQL SELECT 语句使用 ORDER BY 子句将…

mysql配置环境变量(win 10)_mysql配置环境变量(win 10)

1、安装完mysql后就需要配置环境变量 (win 10)选择“我的电脑”&#xff0c;单击右键&#xff0c;选择“属性->高级->环境变量中的系统变量&#xff0c;对 MYSQL_HOME、Path 这 2 个系统变量分别设置如下相应的值(设置原则&#xff1a;如果存在相应的变量&#xff0c;直接…