linux内核
文章平均质量分 91
我恨天
这个作者很懒,什么都没留下…
展开
-
linux的netlink机制
netlink作为一种用户空间和内核空间通信的机制已经有一定年头了,它不光为了内核和用户通信,还可以作为IPC机制进行进程间通信。其实netlink定义了一个框架,人们可以基于这个框架用它来做可以做的任何事情,linux中不乏这些类似的好的框架。它们的共同点就是内核并不管它们能做什么,然而它们真的很强大,往往可以做到的事情很多,这就是内核不问策略只管实现机制,所有策略让用户实现,netlink框架转载 2013-10-09 22:19:19 · 819 阅读 · 0 评论 -
内核中的notification chain浅析
内核中的很多子系统都是联系很紧密的,因此有可能某个子系统的某些事件,其他多个子系统都很感兴趣,此时就需要用到notification chain. 举个具体的例子,比如说一台主机由于某个网卡的损坏或其他原因不能使用,从而导致连接此网卡的网络不能使用,这个时侯就是notification chain.来通知路由表去除这个网络的路由表项。 notification chain就是一个链转载 2013-08-15 22:23:43 · 498 阅读 · 0 评论 -
tcp connection setup的实现(一)
bind的实现: 先来介绍几个地址结构. struct sockaddr 其实相当于一个基类的地址结构,其他的结构都能够直接转到sockaddr.举个例子比如当sa_family为PF_INET时,sa_data就包含了端口号和ip地址(in_addr结构). Java代码 struct sockaddr { sa_family_转载 2013-08-16 09:45:14 · 1431 阅读 · 0 评论 -
linux内核中socket的实现
首先来看整个与socket相关的操作提供了一个统一的接口sys_socketcall. 下面就是它的代码片段: Java代码 asmlinkage long sys_socketcall(int call, unsigned long __user *args) { unsigned long a[6]; unsigned转载 2013-08-15 22:42:28 · 2435 阅读 · 0 评论 -
ip层和4层的接口实现分析
首先来看一下基于3层的ipv4以及ipv6实现的一些4层的协议: 这里要注意并没有IGMPV6,这是因为在ipv6中,它是作为iCMPv6的一部分实现的. 首先我们要知道输入数据包的ip头中的protocol域标识了,将要传递的4层协议. 我们这里主要介绍的是ip数据包从3层传递到4层的接口(也就是输入帧接口).而输出帧的处理,我前面的blog都已经转载 2013-08-15 22:40:58 · 771 阅读 · 0 评论 -
linux下ip协议(V4)的实现(五)
这次主要介绍一些ip层管理以及统计相关的东西. 首先来看 long-living ip peer information. 我们知道ip协议是无状态的协议.这里内核为了提升性能.为每个目的ip地址(换句话说,也就是和本机进行通信过的主机)保存了一些信息. peer子系统一般是被tcp,或者routing子系统所使用. 这个信息的数据结构是inet_peer,它是一棵转载 2013-08-15 22:39:25 · 1254 阅读 · 0 评论 -
linux下ip协议(V4)的实现(四)
这次主要介绍的是ip层的切片与组包的实现。 首先来看一下分片好的帧的一些概念: 1 第一个帧的offset位非0并且MF位为1 2 所有的在第一个帧和最后一个帧之间的帧都拥有长度大于0的域 3 最后一个帧MF位为0 并且offset位非0。(这样就能判断是否是最后一个帧了). 这里要注意在linux中,ip头的frag_off域包含了 rfcip头的定义中的转载 2013-08-15 22:37:46 · 1739 阅读 · 0 评论 -
linux下ip协议(V4)的实现(一)
首先来看校验相关的一些结构: 1 net_device结构: 包含一个features的域,这个表示设备的一些特性(比如控制校验),下面的几个flag就是用来控制校验: Java代码 #define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */ #define NE转载 2013-08-15 22:34:30 · 726 阅读 · 0 评论 -
linux下ip层的一些概念
首先来看这个ip层的结构: 这里看到非常多的netfilter hook,这是因为netfilter主要是针对ip层的。 ip层的主要任务有下面5个方面: 1 ip数据包的校验 2 防火墙的处理(也就是netfilter子系统) 3 处理options(这里的options包含了一些可选的信息。比如时间戳或者源路由option). 4 切转载 2013-08-15 22:33:33 · 697 阅读 · 0 评论 -
网桥在内核的实现
我们知道netdevice有一个priv域,这个域用来保存设备的私有数据,当这个设备是一个网桥的时候,priv域也就指向一个struct net_bridge. 接下来看net_bridge以及相关的数据结构: Java代码 struct net_bridge { ///自旋锁 spinlock_t lock;转载 2013-08-15 22:32:21 · 758 阅读 · 0 评论 -
内核中接收网络帧的处理(2层)
我这里描述的只是2层的处理。 首先,我们来看softnet_data这个结构,每个cpu都有这样的一个队列,它主要是用来存储incoming frame。由于他是每个cpu都有一个队列,因此在不同的cpu之间我们就不要任何锁来控制并发的处理这个帧队列。我们在操作系统层要取得帧数据,都是通过这个数据来读取。 Java代码 /* * Incoming转载 2013-08-15 22:25:03 · 796 阅读 · 0 评论 -
链路层到网络层的数据传递
我们知道在tcp/ip模型中,基本每一层都可以处理多重协议类型,那么当一个输入帧到达后,内核的每一层是如何来取得相应的处理函数呢?也就是说当我要把包传递给上层的时候,如何取得相应协议的处理函数。 我们这里先来看从二层如何把把数据传递给三层。 Java代码 struct sk_buff { ...............................转载 2013-08-15 22:27:40 · 1260 阅读 · 0 评论 -
send、sendto与sys_sendto之间的关系
sys_sendto()sys_socketcall() --> sys_sendto()asmlinkage long sys_sendto( int fd, void __user *buff, size_t len, unsigned转载 2013-10-09 21:46:49 · 4276 阅读 · 0 评论 -
系统调用(追踪sys_socket)
系统调用(追踪sys_socket)在include/linux/syscalls.h中定义了sys_socket函数的函数原型(prototype)asmlinkage long sys_socket(int, int, int);系统调用函数必须满足:asmlinkage long sys_##function-name(##ar转载 2013-10-09 21:40:34 · 1589 阅读 · 0 评论 -
Linux内核配置系统浅析
1、随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中。面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后,都将面临着同样的问题,即如何将源代码融入到 Linux 内核中,增加相应的 Linux 配置选项,并最终被编译进 Linux 内核。这就需要了解 Linux 的内核配置系统。众所周转载 2013-09-02 10:20:11 · 688 阅读 · 0 评论 -
PCI驱动
关于PCI,看了很多资料,现在搞的还是很迷茫,不知道怎么回事,好在比起以前对其了解还是有一些进步的。因为具体我也没理解透彻,特别一些代码还是看不懂。所以自己暂时也就不怎么总结了,继续慢慢研究吧、要拿出愚公移山的精神来、下面我把自己研究过的一篇感觉好的文章,摘录过来: 一、PCI简介 PCI是一种外设总线规范。我们先来看一下什么是总线:总线是一种传输信号的路径或信道。典型情转载 2013-08-17 14:42:20 · 973 阅读 · 0 评论 -
Sys文件系统分析
还记得上篇讲到的platform总线、设备、驱动的知识??这里我们先来看一段documentation/filesystems/sysfs.txt里关于sysfs文件系统的描述: sysfs is a ram-based filesystem initially based on ramfs.It provides a means to export kernel data struct转载 2013-08-17 14:22:38 · 1334 阅读 · 0 评论 -
理解 Proc 文件系统
/proc --- 一个虚拟文件系统/proc 文件系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。 与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。如果你察看文件 /proc/mounts转载 2013-08-17 14:09:04 · 622 阅读 · 0 评论 -
linux下ip协议(V4)的实现(三)
这次我们来看数据包如何从4层传递到3层。 先看下面的图,这张图表示了4层和3层之间(也就是4层传输给3层)的传输所需要调用的主要的函数: 我们注意到3层最终会把帧用dst_output函数进行输出,而这个函数,我们上一次已经讲过了,他会调用skb->dst->output这个虚函数(他会对包进行3层的处理),而最终会调用一个XX_finish_output的函数,从而转载 2013-08-15 22:36:33 · 898 阅读 · 0 评论 -
linux下ip协议(V4)的实现(二)
这次主要介绍下forward和local delivery。 上次我们提到当ip_rcv_finish完成后后调用相关的发送函数ip_forward或者ip_local_deliver.这次就主要介绍这两个函数。 先来看forward。 forward一般由下面几部组成: 1 执行ip option 2 确定这个包能被forward 3 减小ttl,当ttl转载 2013-08-15 22:35:33 · 751 阅读 · 0 评论 -
linux下的网桥介绍
网桥用来连接不同的网段。使不同的网段能够相互通信,看起来很像三层的路由。它能够有多个port,从而能够将数据帧从一个port复制到另一个port。 这里要注意一点,linux下的网桥只能用于以太网。 来看下示意图: 其中一个是bridge,一个是route。 网桥的主要工作是从输入帧学习主机的位置,建立一个地址的表(也就是表明这个主机(mac地址)属于那个转载 2013-08-15 22:28:58 · 907 阅读 · 0 评论 -
Spanning Tree Protocol介绍
Spanning Tree Protocol(STP)主要是用在网桥上,用来避免网络回路,并制造冗余连接(也就是保证网络的可靠性). 这里只是一个大概的介绍,具体的还是要去看IEEE 的 802.1D STP的文档。 先看下面的图: 我们可以看到在stp中,只有一个根节点,然后root port指的是将此网桥和root连接起来的那个端口,而designated转载 2013-08-15 22:31:10 · 2006 阅读 · 0 评论 -
内核网络输出帧的处理
首先来看如何打开和关闭一个输出队列。 帧的输出状态是通过device->state设为__LINK_STATE_XOFF来表示的。而打开和关闭队列也就是通过这个状态位来处理。 Java代码 static inline void netif_start_queue(struct net_device *dev) { netif_tx_st转载 2013-08-15 22:26:32 · 800 阅读 · 0 评论 -
linux内核tcp的定时器管理(二)
这次我们来看后面的3个定时器; 首先是keep alive定时器。 这个定时器主要是由于一条连接可能长时间idle,此时就需要发送探测包,来探测对端是否存活,如果对端收到这个探测包,它会立即相应一个ack,而当接受到ack之后,我们就能确认对端是存活的。否则我们会认为这个连接除了问题。 这个定时器是当一个新的连接变为establish状态的时候被激活,如果在当定时器超时还没转载 2013-08-20 22:27:10 · 911 阅读 · 0 评论 -
linux内核中tcp连接的断开处理
我们这次主要来分析相关的两个断开函数close和shotdown以及相关的套接口选项SO_LINGER。这里要注意SO_LINGER对shutdown无任何影响。它只对close起作用。 先来坎SO_LINGER所对应的数据结构: Java代码 struct linger { ///linger的开关 int l_onoff;转载 2013-08-20 22:27:20 · 7763 阅读 · 0 评论 -
linux内核tcp的定时器管理(一)
在内核中tcp协议栈有6种类型的定时器: 1 重传定时器。 2 delayed ack定时器 3 零窗口探测定时器 上面三种定时器都是作为tcp状态机的一部分来实现的。 4 keep-alive 定时器 主要是管理established状态的连接。 5 time_wait定时器 主要是用来客户端关闭时的time_wait状态用到。转载 2013-08-20 22:26:52 · 2702 阅读 · 0 评论 -
Linux Netfilter实现机制和扩展技术
2.4.x的内核相对于2.2.x在IP协议栈部分有比较大的改动, Netfilter-iptables更是其一大特色,由于它功能强大,并且与内核完美结合,因此迅速成为Linux平台下进行网络应用扩展的主要利器,这些扩展不仅包括防火墙的实现--这只是Netfilter-iptables的基本功能--还包括各种报文处理工作(如报文加密、报文分类统计等),甚至还可以借助Netfilter-iptable转载 2013-08-20 22:45:06 · 911 阅读 · 0 评论 -
linux 内核tcp拥塞处理(一)
这次我们来分析tcp的拥塞控制,我们要知道协议栈都是很保守的,也就是说只要有一个段被判断丢失,它就会认为发生了拥塞.而现在还有另一种,也就是路由器来通知我们发生了拥塞,这里ip头还会有一个ECN的位(准确的说是两位),来表示已经发送拥塞,不过这里要注意首先收到ECN的是接受方,可是真正需要被通知的却是发送方,因此当接受方收到ECN之后,用下一个ack来通知发送方有拥塞发生了,然后发送方才会做出响应转载 2013-08-20 22:30:02 · 1511 阅读 · 0 评论 -
tcp协议栈处理各种事件的分析
首先我们来看socket如何将一些状态的变化通知给对应的进程,比如可读,可写,出错等等。 先来看sock结构中这几个相关域: Java代码 struct sock { .......................... wait_queue_head_t *sk_sleep; ............................转载 2013-08-20 22:28:34 · 2422 阅读 · 0 评论 -
内核协议栈tcp层的内存管理
我们先来看tcp内存管理相关的几个内核参数,这些都能通过proc文件系统来修改: Java代码 ///内核写buf的最大值. extern __u32 sysctl_wmem_max; ///协议栈读buf的最大值 extern __u32 sysctl_rmem_max; 这两个值在/proc/sys/net/core 下。这转载 2013-08-20 22:28:04 · 2784 阅读 · 0 评论 -
linux 内核tcp数据发送的实现
在分析之前先来看下SO_RCVTIMEO和SO_SNDTIMEO套接口吧,前面分析代码时没太注意这两个.这里算是个补充. SO_RCVTIMEO和SO_SNDTIMEO套接口选项可以给套接口的读和写,来设置超时时间,在unix网络编程中,说是他们只能用于读和写,而像accept和connect都不能用他们来设置.可是我在阅读内核源码的过程中看到,在linux中,accept和connect转载 2013-08-20 13:51:00 · 5079 阅读 · 0 评论 -
tcp connection setup的实现(三)
先来看下accept的实现. 其实accept的作用很简单,就是从accept队列中取出三次握手完成的socket,并将它关联到vfs上(其实操作和调用sys_socket时新建一个socket类似).然后返回.这里还有个要注意的,如果这个传递给accept的socket是非阻塞的话,就算accept队列为空,也会直接返回,而是阻塞的话就会休眠掉,等待accept队列有数据后唤醒他.转载 2013-08-20 13:50:28 · 1047 阅读 · 0 评论 -
内核处理time_wait状态详解
这次来详细看内核的time_wait状态的实现,在前面介绍定时器的时候,time_wait就简单的介绍了下。这里我们会先介绍tw状态的实现,然后来介绍内核协议栈如何处理tw状态。 首先我们要知道在linux内核中time_wait的处理是由tcp_time_wait这个函数来做得,比如我们在closing状态收到一个fin,就会调用tcp_time_wait.而内核为time_wait状态转载 2013-08-20 22:28:57 · 3190 阅读 · 0 评论 -
内核tcp协议栈SACK的处理
上一篇处理ack的blog中我们知道当我们接收到ack的时候,我们会判断sack段,如果包含sack段的话,我们就要进行处理。这篇blog就主要来介绍内核如何处理sack段。 SACK是包含在tcp的option中的,由于tcp的头的长度的限制,因此SACK也就是最多包含4个段,也就是32个字节。我们先来看tcp中的SACK段的表示: Java代码 str转载 2013-08-20 22:29:45 · 1680 阅读 · 0 评论 -
内核启动用户态的程序
内核启动用户态的应用程序是通过call_usermodehelper来调用的,比较常见的调用,比如modprobe. Java代码 static inline int call_usermodehelper(char *path, char **argv, char **envp, enum umh_wait wait) 参数说明;转载 2013-08-15 22:22:38 · 826 阅读 · 0 评论 -
网络设备的中断处理
我们这里描述的是硬件中断。 设备和内核之间的交互有两种方法。 1 polling(轮询) 也就是kernel来操作交互,由kernel来检测某一个状态,看是否需要让设备做什么。 2 interrupt(中断) 设备来发起交互,设备发出一个硬件中断请求给kernel当他需要kernel的注意时。 当中断来的时候被调用的函数称为interrupt h转载 2013-08-15 22:21:32 · 817 阅读 · 0 评论 -
linux内核组件初始化体系
先来看下内核初始化时调用的一些函数: 这里主要的初始化有三类: 1 boot比如grub,u-boot传递给内核的参数,内核的处理。这里是调用parse_args. 2 中断和时钟的初始化。 3 初始化的函数,这里主要是通过do_initcalls标记的驱动初始化函数。一般这里的初始化函数完成后,会调用free_init_mem释放掉这块的空间。转载 2013-08-15 22:20:08 · 571 阅读 · 0 评论 -
内核网络设备的注册与初始化
首先来看如何分配内存给一个网络设备。 内核通过alloc_netdev来分配内存给一个指定的网络设备: Java代码 #define alloc_netdev(sizeof_priv, name, setup) \ alloc_netdev_mq(sizeof_priv, name, setup, 1) struct net_d转载 2013-08-15 22:18:27 · 870 阅读 · 0 评论 -
linux内核sk_buff的结构分析
我看的内核版本是2.6.32. 在内核中sk_buff表示一个网络数据包,它是一个双向链表,而链表头就是sk_buff_head,在老的内核里面sk_buff会有一个list域直接指向sk_buff_head也就是链表头,现在在2.6.32里面这个域已经被删除了。 而sk_buff的内存布局可以分作3个段,第一个就是sk_buff自身,第二个是linear-data buff,第三转载 2013-08-15 21:53:19 · 707 阅读 · 0 评论 -
linux下的管理内存相关的函数
malloc的实现,在linux下的实现是这样的,当所需要分配的内存大于128k,会用mmap(匿名映射)来实现。小于128k使用在堆分配(改天会分析下malloc函数的源码实现)。 这里还有几个 mallopt(int param,int value); 这个函数能设置一些内存分配管理的参数,也就是设置param为value的值(比如我们想要强制所分配的内存是mm转载 2013-08-20 22:30:11 · 767 阅读 · 0 评论