Table of Contents 1 基本术语 1.1 本书常用的缩写 2 引用计数 2.1 引用计数函数 3 垃圾回收 3.1 异步 3.2 同步 4 函数指针 4.1 缺点 5 goto语句 5.1 使用环境 6 捕捉bug 基本术语 八个位的量通常称为八位组(octet), 本书使用最常见的术语字节(byte). 术语向量(vector)和数组(array)是交互替换使用的. 在上下文中, 术语"入口数据(ingress)"和"输入数据(input)"会交互…
Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sysfs (/sys 文件系统) 1.4 ioctl 系统调用 1.5 netlink 套接字 概论 procfs (/proc 文件系统) 允许内核以文件的形式向用户空间输出内部信息. 可以通过cat, more和> shell重定向进行查看与写入. 编程接口 内核proc文件系统与seq接口(1)…
Table of Contents 1 概述 1.1 帧接收的中断处理 2 设备的开启与关闭 3 队列 4 通知内核帧已接收:NAPI和netif_rx 4.1 NAPI简介 4.1.1 NAPI优点 4.2 NAPI所用之net_device字段 4.3 net_rx_action软中断处理函数和NAPI 4.4 新旧驱动程序接口 概述 帧接收的中断处理 把帧拷贝到sk_buff数据结构. 对一些sk_buff参数做初始化,以便稍后由上面的网络层使用. 更新其他一些该设备私用函数. 设备的开启…
Table of Contents 1 接收到帧时通知驱动程序 1.1 轮询 1.2 中断 2 中断处理程序 3 抢占功能 4 下半部函数 4.1 内核2.4版本以后的下半部函数: 引入软IRQ 5 网络代码如何使用软IRQ 6 softnet_data结构 接收到帧时通知驱动程序 轮询 例如,内核可以持续读取设备上的一个内存寄存器,或者当一个定时器到期时就回头检查哪个寄存器. 中断 此时,当特定事件发生时,设备驱动程序会代表内核指示设备产生硬件中断.内核将中断其他活动,然后调用一个驱动程序 所…
Table of Contents 1 概述 2 定义链 3 链注册 4 链上的通知事件 5 网络子系统的通知链 5.1 包裹函数 5.2 范例 6 测试实例 概述 [注意] 通知链只在内核子系统之间使用. 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣.为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统, Linux内核提供了通知链的机制.通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间之间进行事件的通知. 通知链表是一个函数链表…
Table of Contents 1 套接字缓冲区: sk_buff结构 1.1 网络选项及内核结构 1.2 结构说明及操作函数 2 net_device结构 2.1 MTU 2.2 结构说明及操作函数 套接字缓冲区: sk_buff结构 网络选项及内核结构 一般而言,任何引起内核数据结构改变的选项(如把tc_index字段添加到sk_buff结构),都不适合编译成一个模块. 结构说明及操作函数 sk_buff的成员解释及操作函数详见: linux kernel sk_buff管理 net_d…
Table of Contents 1 设备注册之时 2 设备除名之时 3 分配net_device结构 4 NIC注册和除名架构 4.1 注册 4.2 除名 5 设备初始化 6 设备类型初始化: xxx_setup函数 7 net_device结构的组织 8 查询 9 设备状态 10 注册状态 11 设备的注册和除名 12 设备注册状态通知 13 netdev_chain通知链 14 RTnetlink链接通知 15 设备注册 16 register_netdevice函数 17 设备除名 1…
Table of Contents 1 引导期间的内核选项 2 注册关键字 3 模块初始化代码 引导期间的内核选项 linux运行用户把内核配置选项传给引导记录,然后引导记录再把选项传给内核. 在引导阶段,对parse_args调用两次,负责引导期间配置输入数据. 注册关键字 内核组件可以利用定义在include/linux/init.h中的__setup宏, 注册关键字和相关联的处理函数.以下是其语法: 1: __setup(string, function_handler) string是关…
Table of Contents 1 简介 2 系统初始化概论 2.1 引导期间选项 2.2 中断和定时器 2.3 初始化函数 3 设备注册和初始化 3.1 硬件初始化 3.2 软件初始化 3.3 功能初始化 4 NIC初始化的基本目标 5 IRQ线 6 I/O端口和内存注册 7 硬件中断 7.1 注册中断 7.2 解除中断 8 模块选项 9 设备处理层初始化 10 动态加载设备/设备驱动 简介 如果要使一个网络设备可用,它就必须能被内核正确识别并且与正确的设备驱动关联起来.首先,设备驱动既可…
Table of Contents 1 本章涉及的数据结构 1.1 pci_device_id结构 1.2 pci_dev结构 1.3 pci_driver结构 2 PCI NIC设备驱动程序的注册 2.1 注册 2.2 解除 3 电源管理与网络唤醒 本章涉及的数据结构 pci_device_id结构 1: struct pci_device_id { 2: __u32 vendor, device; /* Vendor and device ID or PCI_ANY_ID*/ 3: __u3…
一.路由的基本概念 1.一条路由就是一组参数,这些参数存储了往一个给定目的地转发流量所需的信息,而一条路由所需的最少的参数集合为:(1)目的网络,(2)出口设备,(3)下一跳网关 2.路由中的相关术语:(1)对称路由:如果从主机A到主机B的路由与从主机B返回主机A的路由相同,这样的路由称为对称路由,(2)metric:是一条路由上配置的可选参数,不要与路由协议中的metric混淆,后者用于衡量一条路由的好坏,路由协议metric的例子有端到端延迟(end-to-end delay),跃点数(th…
概述 1.不论是入口还是出口流量,都是利用fib_lookup来查找路由表,fib_lookup是对每一个路由表所提供的查找函数的包裹函数,当不支持策略路由时,查找函数版本针对的是local表和main表 2.辅助函数: fib_validate_source:对从一个给定设备接收到的封包的源IP地址检查,检测企图的IP欺骗,而且要在开启非对称路由情况下,确保封包的源IP地址通过该封包接收接口是可达的.另外,该函数也返回用于反方向的首选源地址spec_dst,并初始化路由标签(routing t…
路由表基本概念 1.路由是由多个不同的数据结构的组合来描述的,每个数据结构代表路由信息的不同部分.例如,一个fib_node对应一个单独的子网,一个fib_alias对应一条路由.这样做的原因是只需通过部分字段可以区分多条路由.路由子系统不是维护一个庞大而臃肿的结构而是将路由分散为多个片段,这样更容易在相似的路由间共享通用的信息,因而就可以分离出不同的函数,并在这些函数之间定义更加清晰的接口. 数据结构之间的关系如下所示:fib_table结构包含一个由33个指针组成的向量,每个指针对应一个网络…
1.封包从L3至L2的传送过程如下所示: 本地主机的路由子系统选择L3目的地址(下一个跃点). 根据路由表,如果下一个跃点在同一个网络中,邻居层就把目的L3地址解析为跃点的L2地址.这个关联会被放入缓存中以便再次使用. 最后,调用一个函数,例如dev_queue_xmit负责完成发送,将封包传递给流量控制或者Qos层. 2.当收到solicitation请求的主机启动桥接功能时,该主机对其不进行处理,而是按照网桥配置,将其从合适的接口转发出去,桥接功能在邻居协议之前起作用. 3.从邻居的角度来说…
接收到帧时通知驱动程序     在网络环境中.设备(网卡)接收到一个数据帧时,须要通知驱动程序进行处理. 有一下几种通知机制: 轮询:     内核不断检查设备是否有话要说.(比較耗资源,但在一些情况下却是最佳方法) 中断:     特定事件发生时,设备驱动程序代表内核指示设备产生硬件中断,内核中断其他活动满足设备的须要. 多数网络驱动程序使用中断. 中断期间处理多帧:     中断被通知.且驱动程序运行. 然后保持帧的接收(加载),直到输入队列达到指定的数目.或者一直做下去知道队列清空.或者经…
概述    内核的初始化过程过程中,与网络相关的工作如下所示:     内核引导时执行start_kernel,start_kernel结束之前会调用rest_init,rest_init初始化内核线程init(在Linux3-12中为kernel_init). asmlinkage void __init start_kernel(void) { ... parse_early_param();//间接调用parse_args parse_args(...); //处理内核引导程序(boot…
概述:     内核空间与用户空间经常需要进行交互.举个例子:当用户空间使用一些配置命令如ifconfig或route时,内核处理程序就要响应这些处理请求.     用户空间与内核有多种交互方式,最常用的有以下四种:通过/proc虚拟文件系统,通过/sys虚拟文件系统,通过ioctl系统调用,通过Netlink socket. 其中编写程序时最常使用ioctl,这四种方式中有两种是通过虚拟文件系统. procfs 与 sysctl     procfs挂载/proc  sysctl挂载在/pro…
引导期间的内核选项     Linux允许用户把内核配置选项传给引导记录,再有引导记录传给内核,以便对内核进行调整.     start_kernel中调用两次parse_args,用于引导期间配置用户输入数据.     parse_param是一个函数,用于解析输入的内核配置选项的参数字符串.字符串的格式为:name_variable=value.寻址特定关键字,并调用对应的函数. 注册关键字:     用宏进行定义: __setup(string, fn) string表示关键字,fn表示关…
概述     内核的PCI子系统(即PCI层)提供了不同设备一些通用的功能,以便简化各种设备驱动程序.     PCI层重要结构体如下: pci_device_id     设备标识,根据PCI标志定义的ID,而不是Linux本地的. pci_dev     类似于网络设备的net_device.每个PCI会被分配一个net_dev实例. pci_driver     PCI层和设备驱动程序之间的接口.主要由一些函数指针组成.如下所示: struct pci_driver { struct li…
为什么要有内核通知表链:     Linux由多个相互依赖的子系统组成.其中一些子系统可能需要对其他子系统的一些事件感兴趣.这样子系统之间需要一些通信机制来实现这一功能.     在接触Notification Chain之前,我们可能想到通过轮询来实现,事件发生时,子系统轮询所有其他的子系统,看看有没有对这一事件感兴趣的,有没有需要执行的子函数. If (subsystem_X_enabled) { do_something_1 } if (subsystem_Y_enabled) { do_…
设备注册于设备除名     设备注册与设备除名一般有 register_netdev和unregister_netdev完成.这两个是包裹函数,负责上锁,真正起作用的是其调用的register_netdevice和unregister_netdevice.参见:net/core/dev.c.     下图描述了设备注册过程中的一些状态变化     状态的改变会用到UNINITIALIZED和REGISTERED之间的状态REGISTERING.这些进程有netdev_run_todo进行.参照"…
表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看. index.jsp <form id="form1" name="form1" method="post" action="loginServlet"> <table width="357" border="0" align="center"> <t…
本读书笔记系列,主要针对陆舟所著<<Struts2技术内幕 深入解析Strtus2架构设计与实现原理>>一书.笔记中所用的图片若无特殊说明,就都取自书中,特此声明. 什么是框架?我们为什么要用框架?框架能给我们带来什么? 这几个问题既简单又复杂.说它简单,是因为框架确实存在在软件设计中,说它复杂是因为我们现在所使用的框架不论是spring还是struts都是经过多年的发展,其内部已经十分庞杂了,因此想一句话两句话说清楚一个框架就不是那么简单了. OK,既然现有的框架都很复杂,那我们…
KafkaServer是Kafka服务端的主类, KafkaServer中和网络层有关的服务组件包括 SocketServer.KafkaApis 和 KafkaRequestHandlerPool后两者都使用了 SocketServer暴露出来的请求通道( RequestChannel )来处理网络请求 . SocketServer主要关注网络层的通信协议,具体的业务处理逻辑 则交给KafkaRequestHandler和 KafkaApis来完成 . SocketServer和这两个组件一起…
本文部分摘录自互联网. Chromeium与Chrome Chromium是Google为发展自家的浏览器Google Chrome而打开的项目,所以Chromium相当于Google Chrome的工程版或称实验版(尽管Google Chrome自身也有β版阶段),新功能会率先在Chromium上实现,待验证后才会应用在Google Chrome上,故Google Chrome的功能会相对落后但较稳定. Chromium的更新速度很快,每隔数小时即有新的开发版本发布,而且可以免安装,下载zip…
资源缓存 资源缓存的目的是为了提高资源使用的效率,其基本思想是建立一个资源的缓存池,当需要请求资源的时候先去资源池查找是否有相应的资源,如果没有则向服务器发送请求,webkit收到资源后将其设置到该资源类的对象中去,以便于缓存后下次使用,webkit从资源池中查找资源的关键字是URL,URL标记了资源的唯一性. 以上说明一个问题,如果ulr不同,就算内容相同也会被重新请求. 资源加载 鉴于从网络获取资源时一个非常耗时的过程,通常一些资源的加载是异步执行的,也就是说资源的获取和加载不会阻碍 当前…
最佳实践 在讨论基本模式之前,我们先说说一个词:最佳实践 任何程序的编写都得遵循一个特定的规范.这种规范有约定俗称的例如:包名全小写,类名每个单词第一个字母大写等等等等;另外还有一些需要我们严格遵守的:例如我们写自己的servlet的时候就得继承javax.servlet.http.HttpServlet接口. 在标准之上的是对不同标准的具体实现.例如同是servlet标准,tomcat有一套实现方式,Websphere又有不同的实现方式. 在程序员级别来说,面对复杂的业务流程,不同的程序员会有…
如下图中分区到 日 志的虚线表示 : 业务逻辑层的一个分区对应物理存储层的一个日志 . 消息集到数据文件的虚线表示 : 客户端发送的消息集最终会写入日志分段对应的数据文件,存储到Kafka的消息代理节点 .  Kafka服务在启动时会先创建各种相关的组件,最后才会创建 KafkaApis . 业务组件一般都有后台的线程,除了创建组件后,也要启动这些后台线程. 消费者客户端发送“加入组请求”和“同步组请求”给服务端,服务端通过KafkaApis将每请求的处理交给消费组的协调者( GroupCoor…
-Kafka是一个分布式的( distributed ).分区的( partitioned ).复制的( replicated )提交日志( commitlog )服务 . “分布式”是所有分布式系统的特性 :“分区”指消息会按照分区分布在集群的所有节点上 :“复制”指每个分区都会有多个副本存储在不同的节点上:“提交日志”指新的消息总是以追加的方式进行存储. 写到提交日志的目的是防止节点宕机后,因内存中的数据来不及刷写到磁盘而导致数据丢失 . 分布式存储系统除了提交日志,一般还有真正的数据存储格…
在0.10版本之前, Kafka仅仅作为一个消息系统,主要用来解决应用解耦. 异步消息 . 流量削峰等问题. 在0.10版本之后, Kafka提供了连接器与流处理的能力,它也从分布式的消息系统逐渐成为一个流式的数据平台 . Kafka 流式数据平台 作为一个流式数据平台,最重要的是要具备下面3个特点 . 类似消息系统,提供事件流的发布和订阅,即具备数据注入功能 : 存储事件流数据的节点具有故障容错的特点,即具备数据存储功能 : 能够对实时的事件流进行流式地处理和分析,即具备流处理功能 . Kaf…