我的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格式的文本,基本上其他格式的文档&#…

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

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

汇编_指令_FLAGS

标志名 标志 1 标志 0 OF (溢出标志) OV NV DF (方向标志) UP DN IF (中断标志&a…

利用PUT方式上传文件的方法研究

虽然没有POST方法使用广泛,但是PUT方法却是向服务器上传文件最有效率的方法。POST上传文件时,我们通常需要将所有的信息组合成 multipart 传送过去,然后服务器再解码这些信息,解码过程则必不可少的会消耗内存和CPU资源&#xff0c…

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

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

python-day3

1.内存 sublime中程序运行一次后,变量并不保存在内存中,和maya中不一样。转载于:https://www.cnblogs.com/moyanljx/p/9319988.html

nginx+mysql+php+cacti+rrdtool全方位架构急速版

时间调整: /usr/sbin/ntpdate stdtime.sinica.edu.twcentos5.2 系统测试OK 新机全配置步骤及方法: 1、给系统刷新下yum 主件加速yum安装的速度; yum -y install yum-fastestmirror.noarch 引用 warning: rpmts_HdrFromFdno: Header V3 DSA si…

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

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

Java基础(三)对象与类

1.类的概念&#xff1a;类是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。 2.封装的概念&#xff1a;封装&#xff08;有时称为数据隐藏&#xff09;是与对象有关的一个重要概念。对象中的数据称为实例域&#xff0c;操纵数据的过程称为方法。对于每个特定的类实…

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

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

English trip -- VC(情景课)2 D Reading

Xu言&#xff1a; 业精于勤&#xff0c;荒于嬉&#xff1b;行成于思&#xff0c;毁于随 Before you read 阅读准备 Talk about the picture&#xff0c; what do you see&#xff1f;看图说话&#xff0c;你看到了什么&#xff1f; Listen and read 听并读 Sue, Have fun at sc…

VLAN访问控制列表(VACL)的配置方法

VLAN访问控制列表(VACL)的配置方法同普通的访问控制列表不同,VACL是用在VLAN内对数据进行过滤的,而前者是用在第三层接口对出入的数据包进行过滤,例如:在同一个VLAN内部,我们可能不允许其他主机对另一台主机进行访问,此时我们可以使用VLAN来实现,其配置方法如下:1.创建VACL(是以…

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

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

js规范

一个js文件中&#xff0c;包含多个函数&#xff0c;应该只有一个调用&#xff0c;例如: var fun function(x) {if (x < 1) {return x;} else {return -x;} }function ensure(condition, message) {if (!condition) {console.log(message)} }function testFun() {ensure(fun…

原来嵌套个网页的技术是这样的

一开始被其他技术说的似乎很难实现一样&#xff0c;以前自己学过点开发的技术&#xff0c;不过都是皮毛&#xff0c;本想走开发的&#xff0c;没走成&#xff0c;呵呵&#xff0c;还是走到了自己的本专业。 页面一、 <html> <head> <meta http-equiv"Conte…

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

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

git github

今日内容&#xff1a;git 1. 版本管理工具 - git - svn https://git-scm.com/downloads 2. 大表哥创业故事&#xff1a;北京热 a. 初次创建版本 git init git config --global user.email "youexample.com" git config --global user.name "Your Name"…

系统的常用安装方法

原装系统安装1、 开机看屏幕提示进入BIOS设置引导顺序&#xff0c;First Boot设置为CD-ROM。一般是按Delete键进入&#xff0c;或者是F12直接进入引导菜单选择CD-ROM&#xff08;现代新的主板会有引导菜单&#xff09; 2、 设置光驱引导&#xff08;主板不同可能设置有所不同&a…

C++重载运算符

其实在C中&#xff0c;运算符也是一种函数&#xff0c;有自己的类型&#xff0c;有自己的参数&#xff0c;有自己的返回值。 下面就是重载的方法&#xff1a; struct vec {int x;int y; }; vec operator(const vec &a,const vec &b) //括号里面的是参数 {vec temp;temp…