在开始今天的内容之前,其实有一些题外话可以和大家分享一下。自从工作以来,我个人一直都有一个观点。那就是怎么样利用简单的代码来说明开发中的问题,或者是解释软件中的原理,这是一个很高的学问。有些道理看上去云里雾里说不清楚,其实都可以通过编写代码来验证的.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

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

训练营课前预习资料包:

添加秋香小姐姐 立即领取

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

我的Linux内核学习笔记相关推荐

  1. 操作系统进程学习(Linux 内核学习笔记)

    操作系统进程学习(Linux 内核学习笔记) 进程优先级 并非所有进程都具有相同的重要性.除了大多数我们所熟悉的进程优先级之外,进程还有不同的关键度类别,以满足不同需求.首先进程比较粗糙的划分,进程可 ...

  2. Linux内核学习笔记

    1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档   [力荐] 5. ...

  3. linux内核学习笔记【一】临时内核页表 Provisional kernel Page Tables

    最近开始学习linux内核,看了<深入理解linux内核>,开始写点学习收获.内核版本为2.6.11 临时全局目录(provisional page global directory)是在 ...

  4. Linux内核学习笔记之网卡驱动的详细分析:RTL8139

    学习应该是一个先把问题简单化,在把问题复杂化的过程.一开始就着手处理复杂的问题,难免让 人有心惊胆颤,捉襟见肘的感觉.读Linux网卡驱动也是一样.那长长的源码夹杂着那些我们陌生的变量和符号,望而生畏 ...

  5. 20135316王剑桥Linux内核学习笔记第三周

    20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 三个法宝:存储程序计算机.函数调 ...

  6. Linux内核学习笔记 - RCU机制总结

    目录 一.什么是RCU机制 1.历史背景 -- 原始的RCU思想 2.基础架构 -- RCU算法设计 3.实现思路-- 读写回收实现思路 4.实现思路 -- 实例说明 宽限期 订阅--发布机制 数据读 ...

  7. [Linux][内核学习笔记]--CFS调度器

    文章目录 1. 进程的状态转换 2. 内核调度器的发展 3. 调度策略 4. 与调度相关的系统调用 5. 优先级 6. CFS调度器的实现 6.1 相关结构体 6.1.1 sched_entity 结 ...

  8. Linux内核学习笔记(十)中断处理的下半部(Bottom Halve)

    为什么需要下半部 中断处理程序有如下局限性: 中断处理程序是异步中断,被其中断执行的代码(包括别的中断处理程序)可能正在执行非常重要的任务,为了避免被中断进程停止过长时间,中断处理程序的执行应该越快越 ...

  9. Linux内核学习笔记(6)-- 进程优先级详解(prio、static_prio、normal_prio、rt_priority)...

    Linux 中采用了两种不同的优先级范围,一种是 nice 值,一种是实时优先级.在上一篇粗略的说了一下 nice 值和实时优先级,仍有不少疑问,本文来详细说明一下进程优先级.linux 内核版本为 ...

最新文章

  1. 19个超赞的数据科学和机器学习工具,编程小白必看!(附资料)
  2. github 2FA里的recovery code,一定要好好保存
  3. 一个简单的 js 时间对象创建
  4. Python中递归字符串反转
  5. linux命令找目录,linux中何种指令可以查看当前所处的目录位置?
  6. 安装linux系统过程中值得记录的内容
  7. webpack 编译完成执行代码
  8. notepad++ :正则表达式系统教程(zz)
  9. windows c++版faster-rcnn
  10. ubuntu 12.04 mysql_Ubuntu 12.04 mysql 源码安装--mysql.5.5.x
  11. java从hbase增量导出到,Hbase实用技巧:全量+增量数据的迁移方法
  12. 二维数组越界_中国电子学会青少年软件编程等级考试2级(C/C++)专题二:一维数组...
  13. 28个python爬虫项目,你想要的爬虫知识都准备好了~~
  14. 手动实现一维离散数据小波分解与重构
  15. 国庆头像生成器小程序源码
  16. 对QT5信号与槽的认识
  17. parameter缩略语_WB 术语及缩略语表
  18. RSD的PANSHARP融合——以GF2为例
  19. 你想要创建一个属于自己的网站吗?十大免费网站
  20. 利用openCV(C++)实现Halcon中的min_max_gray函数的功能

热门文章

  1. Go语言channel与select原理
  2. 开源中国 2014 年源创会年度计划
  3. Visual Studio 2017新版发布,极大提高开发效率丨附下载 1
  4. 【TL】【编码】瞬间移动-百度之星初赛(Astar Round2B)1003-2016.05.22
  5. PHP多种形式发送邮件
  6. 企业应该如何选型ERP?
  7. 画图板-- 中点算法画圆
  8. laravel安装prettier,git hook代码格式化工具
  9. C语言中临时变量写在哪里,C语言中不允许创建临时变量,交换两个数的内容
  10. du -sh 如何找到最大的文件夹_小白必看!手把手教你如何在linux上安装redis数据库...