在开始明天的内容之前,虽然有一些正题可以和你们分享一下。自从工作以来,我个人始终都有一个观点。那就是怎样样借助简单的代码来说明开发中的问题,或则是解释软件中的原理,这是一个很高的学问。有些道理看起来云里雾里说不清楚,虽然都可以通过编撰代码来验证的.os可以、cpu可以、cache可以、编译器可以、网络合同也可以,好多好多的内容完全可以通过几行代码就可以抒发得十分清楚,而且事实上我们并没有如此做。
我想缘由无非是那么几条,
一来授业者对相关知识的学习也是逗留在概念上而已;
二来我们的学习过分乏味和教条、太关注知识、不求实践;
三就是学习者自身缺乏思索的能力、缺少自我反思的能力、对好多东西不求甚解。
而学习Linux内核能够挺好的帮助我们解决那些问题。
Linux内核学习路线:
以网路合同栈为例:
1、Linux内核源代码结构
Linux的内核源代码可以从网站上下载,Linux-4.1.2以上的版本(含)。其代码目录结构如下:
组织代码另一个表现方式就是映射到Linux代码的3个内核层:
2、内核中网路分析流程
网路合同栈是由若干个层组成的,网路数据的流程主要是指在合同栈的各个层之间的传递。在后面章节中TCP网路编程的流程,一个TCP服务器的流程根据构建socket()函数,绑定地址端口bind()函数,侦听端口listen()函数,接收联接accept()函数,发送数据send()函数,接收数据recv()函数,关掉socket()函数的次序来进行。与此对应内核的处理过程也是根据此次序进行的,网路数据在内核中的处理过程主要是在网卡和合同栈之间进行:从网卡接收数据,交给合同栈处理;合同栈将须要发送的数据通过网路发出去。
如右图所示,总结了各层间在网路输入输出时的层间调用关系。由图中可以看出,数据的流向主要有两种。应用层输出数据时,数据根据自上而下的次序,依次通过接口层、协议层和插口层;当有数据抵达的时侯,自下而上依次通过插口层、协议层和接口层的方法,在内核层传递。
应用层Socket的初始化、绑定(bind)和销毁是通过调用内核层的socket()函数进行资源的申请和销毁的。发送数据的时侯,将数据由接口层传递给合同层,合同层在UDP层添加UDP的首部、TCP层添加TCP的首部、IP层添加IP的首部,插口层的网卡则添加以太网相关的信息后linux内核内存分配,通过网卡的发送程序发送到网路上。
接收数据的过程是一个相反的过程,当有数据到来的时侯虚拟主机 linux,网卡的中断处理程序将数据从以太网网卡的FIFO对列中接收到内核,传递给合同层,合同层在IP层剥离IP的首部、UDP层剥离UDP的首部、TCP层剥离TCP的首部后传递给接口层,接口层查询socket的标示后,将数据献给用户层匹配的socket。
如右图所示为Linux内核层的网路合同栈的构架视图。最前面是用户空间层,应用层的程序坐落此处。最顶部是化学设备,比如以太网网卡等,提供网路数据的联接、收发。中间是内核层,即网路合同栈子系统。流经网路栈内部的是socket缓冲区(由结构sk_buffs接连),它负责在源和汇点之间传递报文数据。
底部(参见上图所示)是系统调用插口,它为用户空间的应用程序提供了一种访问内核网路子系统的插口。坐落其下边的是一个合同无关层,它提供了一种通用方式来使用底层传输层合同。之后是实际合同linux内核内存分配,在Linux中包括内嵌的合同TCP、UDP,其实还有IP。之后是另外一个网路设备合同无关层,提供了与各个设备驱动程序通讯的通用插口linux命令手册,最下边是设备驱动程序本身。
·····························
而这种内核笔记就是我给你们推荐的《Linux内核显存管理》训练营的当堂笔记,对内核的每一块技术进行抽丝剥茧的剖析。
学习三部曲
1.扫描上图二维码报考训练营;
2.详情页添加老师发放课前预习资料;
3.下午八点准时参与直播。
训练营能解决我们Linux内核学习中的什么问题?
1.大块内核显存怎样样分配?
2.伙伴系统怎样申请内核显存?
3.slab分配器怎么申请内核显存的?
4.vmalloc()申请的显存有哪些特征?
5.用户程序使用malloc()申请到的显存空间在哪些范围?
6.TLB中缓存的是哪些内容?
7.虚拟显存怎么组织的?
8.缺页机制是怎样实现?
最后再提醒下,训练营限时特价!
明天到手价0.02,原价198
课程永久有效,让利就这三天,抓紧!
训练营课前预习资料包:
添加秋香小妹妹立刻发放