
linux1.2.13源码分析
文章平均质量分 65
linux1.2.13源码分析
theanarkh
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
nodejs源码分析第十九章 -- udp模块
第十九章 udpudp不是面向连接的协议,所以使用上会比tcp简单,但是作为传输层的协议,udp虽然没有tcp那么复杂,但是他和tcp一样,使用四元组来标记通信的双方(单播的情况下)。我们看看udp作为服务器和客户端的时候的流程。1 在c语言中使用udp1.1 服务器流程(伪代码)// 申请一个socketint fd = socket(...);// 绑定一个众所周知的地址,像tcp一样bind(fd, ip, port);// 直接阻塞等待消息的到来,因为udp不是面向连接的,所以不需要原创 2020-09-19 21:39:31 · 395 阅读 · 0 评论 -
通过源码理解rarp协议(基于linux1.2.13)
rarp是通过mac地址查询ip的协议,主要用于有mac的主机,但是没有ip的情况。我们先看看rarp协议的协议定义(来自网上的图)。rarp协议的格式和arp协议是一样的,他们都是通过一种地址查询另外一种地址。操作系统内维护了一个转换表。定义如下。struct rarp_table{ struct rarp_table *next; /* Linked entry list */ unsigned long ip;原创 2020-09-18 01:26:03 · 335 阅读 · 0 评论 -
通过源码理解IGMP v1的实现(基于linux1.2.13)
IGMP是组成员管理协议,我们知道一般的通信是单播的,虽然主机发出的单播报文,局域网中的每个主机都会收到,但是默认情况下,主机只会处理目的ip是自己的报文。如果我想让多个主机都可以处理我发出的报文怎么办呢?这就是IGMP做的事情。他定义了组的概念,我们可以使用多播的方式,给一个组发送报文,属于这个组的主机都可以处理这个报文。下面我们看看多播是怎么实现的。首先我们看一下网络架构。ip地址中给多播预留了一段范围的ip。IGMP的一个多播组其实就是一个多播ip。主机记录了本主机加入的多播组信息。组播路由记录了原创 2020-09-16 00:07:03 · 970 阅读 · 0 评论 -
理解进程间通信
进程是一个实体,两个实体间的通信就需要介质。使用不同的介质,就对应了不同的通信方式。进程的通信方式分为两种,同主机和不同主机。下面我们来逐个分析。1 匿名管道匿名管道是进程间通信中比较简单的一种,他只用于有继承关系的进程,因为匿名,非继承关系的进程无法找到这个管道,也就无法完成通信,而有继承关系的进程,是通过fork出来的,父子进程可以获得得到管道。进一步来说,子进程可以使用继承于父进程的资源...原创 2020-04-02 23:28:53 · 294 阅读 · 0 评论 -
深入理解TCP/IP协议的实现之ip分片(基于linux1.2.13)
上次分析了ip分片重组,这次分析一下ip分片。首先我们要先了解为什么需要分片。比如在以太网中,使用CSMA/CD协议(由网卡实现),他规定了一个链路层数据包(不包括mac头,但是这一版内核实现的时候是包括了mac头的大小)的最大值(MTU)和最小值。所以如果上层的包大于这个阈值就需要被分片。而分片和组包的实现是在ip层。我们看一下具体的逻辑。ip分片的逻辑在ip_fragment函数里实现。vo...原创 2020-03-13 22:56:17 · 459 阅读 · 0 评论 -
深入理解TCP/IP协议的实现之ip分片重组(基于linux1.2.13)
我们都知道数据链路层有mtu的限制,如果我们上层发的包太大,那就要分片,那么对端就需要重组分片,组装好再通知上层。我们看一下分片重组的过程。我们看一下分片重组中用到的数据结构。ipq结构体是代表一个完整的传输层包,他被ip层分成了多个分片。ipfrag结构体是代表一个ip分片。他是传输层包的一个部分。我们开始分析组片之前,先分析一下基础的操作。1 创建一个用于重组传输层数据包的结构体ipq。...原创 2020-03-13 00:10:51 · 661 阅读 · 4 评论 -
深入理解TCP/IP协议的实现之connect(基于linux1.2.13)
分析完了服务器端,我们继续分析客户端,在socket编程中,客户端的流程是比较简单的,申请一个socket,然后调connect去发起连接就行。我们先看一下connect函数的定义。/* socket 通过socket函数申请的结构体 address 需要连接的目的地地址信息*/int connect(int socket, const struct sockaddr *address,...原创 2020-03-10 23:10:19 · 642 阅读 · 0 评论 -
深入理解TCP/IP协议的实现之三次握手(基于linux1.2.13)
上篇我们分析了accept函数,他是消费者,这篇我们看看生产者是怎么实现的。我们从tcp_rcv函数开始,这个函数是一个分发器。当接收到一个tcp包的时候,底层就会调这个函数交给tcp层处理。// daddr,saddr是ip头的字段,len为tcp头+数据长度 int tcp_rcv( struct sk_buff *skb, struct device *dev, struct ...原创 2020-03-07 16:30:08 · 349 阅读 · 0 评论 -
深入理解TCP/IP协议的实现之accept(基于linux1.2.13)
我们解析分析tcp/ip协议的实现,这一篇讲一下accept,accept就是从已完成三次握手的连接队列里,摘下一个节点。我们可以了解到三次握手的实现和过程。很多同学都了解三次握手是什么,但是可能很少同学会深入思考或者看他的实现,众所周知,一个服务器启动的时候,会监听一个端口。其实就是新建了一个socket。那么如果有一个连接到来的时候,我们通过accept就能拿到这个新连接对应的socket。那...原创 2020-03-07 13:33:08 · 1027 阅读 · 0 评论 -
深入理解TCP/IP协议的实现之listen(基于linux1.2.13)
listen函数的逻辑比bind还简单。bind主要是校验和绑定ip、端口。listen则是修改socket的状态,并记录一些设置。static int sock_listen(int fd, int backlog){ struct socket *sock; if (fd < 0 || fd >= NR_OPEN || current->files->fd[f...原创 2020-03-06 01:51:40 · 388 阅读 · 0 评论 -
深入理解TCP/IP协议的实现之socket(基于linux1.2.13)
socket大家都知道是用于网络通信的,也知道他是ip和端口的组合。但是很多同学可能不是很清楚socket的原理和实现。下面我们深入理解一下socket到底是什么。 我们回忆一下socket编程的步骤,不管是客户端还是服务端,第一个调的函数都是socket。我们就从这个函数的实现开始,看看一个socket到底是什么。// 新建一个socket结构体...原创 2020-03-06 00:40:32 · 405 阅读 · 0 评论 -
揭开虚拟文件系统的云雾之多文件系统是如何运作的(基于linux1.2.13)
由之前的分析中我们知道,挂载根文件系统后,系统里存在根文件系统的超级块和一个根节点inode。并设置了init进程的工作目录和当前目录为根节点。我们知道文件操作是从open开始的,open就是根据文件路径找到对应的inode。并返回一个fd,后续的文件操作就可以通过fd找到inode,执行读写操作。所以我们就以open函数为例。分析多文件系统的运作。看看虚拟文件系统在抹平各个文件系统的差异后,又...原创 2019-12-28 02:58:28 · 181 阅读 · 0 评论 -
虚拟文件系统源码解析之open(基于linux1.2.13)
我们操作一个文件之前都需要先open一下。我们看看open在虚拟文件系统中大致的执行过程。不会分析具体的过程。主要分析一下虚拟文件系统的实现原理。asmlinkage int sys_open(const char * filename,int flags,int mode){ char * tmp; int error; error = getname(filename, &...原创 2019-12-28 00:11:14 · 288 阅读 · 0 评论 -
虚拟文件系统源码解析之初始化(基于linux1.2.13)
从main函数开始,直到虚拟文件系统的初始化,路径是init()->setup()->syssetup();sys_setup主要是注册了虚拟文件系统下面所有的文件系统。然后挂载根文件系统。下面是初始化代码。asmlinkage int sys_setup(void){ static int callable = 1; if (!callable) return -1;...原创 2019-12-28 00:07:50 · 202 阅读 · 0 评论 -
揭开虚拟文件系统的云雾(1)(基于linux1.2.13)
这一篇我们来看看,虚拟文件系统是如何抹平各个文件系统的差异,又是如何和具体的文件系统串起来的。我们先来回顾一下之前的讲的内容。 void mount_root(void){ ... for (fs_type = file_systems ; fs_type ; fs_type = fs_type->next) { if(retval) break; // 没有关...原创 2019-12-26 23:17:54 · 167 阅读 · 0 评论 -
linux进程通信之共享内存原理(基于linux 1.2.13)
1 有一个全局的结构体数据,每次需要一块共享的内存时(shmget),从里面取一个结构体,记录相关的信息。struct shmid_ds { // 权限相关 struct ipc_perm shm_perm; /* operation perms */ // 共享内存的大小 int shm_segsz; /* size of segment (bytes) */ tim...原创 2019-11-09 18:06:46 · 241 阅读 · 0 评论 -
网络函数bind源码分析
{ struct socket *sock; int i; char address[MAX_SOCK_ADDR]; int err; if (fd &lt; 0 || fd &gt;= NR_OPEN || current-&gt;files-&gt;fd[fd] == NULL) return(-EBADF); // 通过文件描述符找到对应的socket,见socket函数源...原创 2019-01-01 19:35:42 · 442 阅读 · 0 评论 -
linux单向循环链表源码分析(基于linux1.2.13)
extern inline void add_wait_queue(struct wait_queue ** p, struct wait_queue * wait){ unsigned long flags;#ifdef DEBUG if (wait->next) { unsigned long pc; __asm__ __volatile__("call 1f\n" ...原创 2019-07-06 16:23:27 · 221 阅读 · 0 评论 -
minix文件系统源码分析之inode.c(基于linux1.2.13)
该文件是实现软链接相关的功能。我们可以了解到软链接的实现原理。/* * linux/fs/minix/symlink.c * * Copyright (C) 1991, 1992 Linus Torvalds * * minix symlink handling code */#ifdef MODULE#include <linux/module.h>#e...原创 2019-07-07 04:05:37 · 690 阅读 · 0 评论 -
minix文件系统源码分析之namei.c(上)(基于linux1.2.13)
/* * linux/fs/minix/namei.c * * Copyright (C) 1991, 1992 Linus Torvalds */#ifdef MODULE#include <linux/module.h>#endif#include <linux/sched.h>#include <linux/minix_fs.h...原创 2019-07-07 04:14:05 · 592 阅读 · 0 评论 -
minix文件系统源码分析之bitmap.c(基于linux1.2.13)
/* * linux/fs/minix/bitmap.c * * Copyright (C) 1991, 1992 Linus Torvalds *//* bitmap.c contains the code that handles the inode and block bitmaps */#ifdef MODULE#include <linux/module.h...原创 2019-07-07 04:15:46 · 378 阅读 · 0 评论 -
系统调用之mprotect源码分析(基于linux1.2.13)
mprotect系统调用是修改内存页属性的,他修改的内容包括vma的内容和页表项内容。linux用vma链表管理一个进程使用的虚拟地址空间。下面是实现代码。/* * linux/mm/mprotect.c * * (C) Copyright 1994 Linus Torvalds */#include <linux/stat.h>#include <linux/s...原创 2019-07-27 02:21:12 · 953 阅读 · 0 评论 -
系统调用之mmap源码分析(基于linux1.2.13)
mmap涉及到操作系统底层很多知识,目前粗略介绍一下大概的逻辑,等深入理解后再继续。操作系统用vma链表管理内存,mmap就是申请一个新的vma供进程使用。可以当作内存使用,也可以当做文件来使用vma对应的这片空间。但是申请的vma,还不会分配物理地址。等到真正访问这片地址的时候,由缺页处理程序作物理页的映射。下面是mmap函数入口,没有太多逻辑。asmlinkage int sys_mmap...原创 2019-07-27 18:16:21 · 344 阅读 · 0 评论 -
linux内存管理源码分析memory.c上篇(基于linux1.12.13)
/* * linux/mm/memory.c * * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds *//* * demand-loading started 01.12.91 - seems it is high on the list of * things wanted, and it should be eas...原创 2019-08-18 19:48:45 · 483 阅读 · 0 评论 -
文件系统之file结构体管理源码分析(基于linux1.2.13)
操作系统为进程维护了打开的文件列表,每个进程维护了一个file数组字段(struct file * fd[NR_OPEN]);每个元素指向一个file结构体。每个file结构体有一个字段指向inode结构体,inode管理这个文件的内容、权限等信息。这里分析的是file结构体的管理。下面是file结构体的定义struct file { mode_t f_mode; loff_t f_...原创 2019-07-02 02:03:37 · 354 阅读 · 0 评论 -
socket连接和通信过程解析
网络通信的标准流程是,服务端新建一个socket,然后在该socket中绑定一个地址,再设置该socket为监听socket,然后阻塞在accept等待连接。客户端新建一个socket,然后connect到一个服务端的地址。下面分析一下这个过程。看多个客户端或者多个连接是如何在一个监听的socket中完成通信的。服务器收到一个syn包的时候,在tcp_rcv中进行处理。该函数收到根据tcp数据包...原创 2019-04-22 00:16:53 · 871 阅读 · 0 评论 -
RAW协议源码解析
RAW协议用于在IP层上实现自己的协议,该协议需要自己填充IP头和数据部分,内核只负责填充MAC头和源ip字段,该版本还没实现通过参数让内核填充IP头的功能。该协议的位置和TCP类似,内核在创建一个socket的时候,在底层会创建一个sock结构体,sock结构体会保存一系列操作函数的指针。实例代码(参考https://sock-raw.org/papers/sock_raw)#include...原创 2019-02-15 21:03:28 · 3181 阅读 · 0 评论 -
ip分片源码解析(基于linux1.2.13)
开局一张图,内容全靠编,ip分片的处理过程使用的数据结构如上图所示。每各ipq结构体负责一个ip数据包的分片处理,每个ipfrag结构体代表一个ip数据包中的一个分片。全局指针ipqueue管理所有ip数据包的所有分片。// 创建一个表示ip分片的结构体static struct ipfrag *ip_frag_create(int offset, int end, struct sk_bu...原创 2019-01-19 15:07:57 · 907 阅读 · 0 评论 -
linux1.2.13消息队列源码解析
消息队列原理是操作系统维护一个固定大小的数组,当进程通过一个key申请一个消息队列的时候,系统从数组中找到一个可用的索引,他指向一个新的msqid_ds结构体,其他进程通过这个key可查到对应的消息队列,msqid_ds结构体中维护一个消息内容的链表,读写操作的时候通过操作这个链表来完成通信。/* * linux/ipc/msg.c * Copyright (C) 1992 Krishna...原创 2019-01-13 04:00:58 · 488 阅读 · 0 评论 -
网络函数accept源码分析
static int sock_accept(int fd, struct sockaddr *upeer_sockaddr, int *upeer_addrlen){ struct file *file; struct socket *sock, *newsock; int i; char address[MAX_SOCK_ADDR]; int len; if (fd &lt; ...原创 2019-01-01 22:25:24 · 452 阅读 · 0 评论 -
网络函数listen源码分析
{ struct socket *sock; if (fd &lt; 0 || fd &gt;= NR_OPEN || current-&gt;files-&gt;fd[fd] == NULL) return(-EBADF); if (!(sock = sockfd_lookup(fd, NULL))) return(-ENOTSOCK); if (sock-&gt;stat...原创 2019-01-01 19:54:43 · 340 阅读 · 0 评论 -
网络编程函数socket源码分析
static int sock_socket(int family, int type, int protocol){ int i, fd; struct socket *sock; struct proto_ops *ops; for (i = 0; i &lt; NPROTO; ++i) { // 从props数组中找到family协议对应的操作函数集,props由系统初始化时s...原创 2019-01-01 18:44:54 · 1210 阅读 · 0 评论 -
网络源码初始化分析
原创 2019-01-01 18:01:41 · 255 阅读 · 0 评论 -
unix域源码解析
首先我们先要创建一个用于通信的结构unix_proto_data ,并初始化某些字段static int unix_proto_create(struct socket *sock, int protocol){ struct unix_proto_data *upd; /* * No funny SOCK_RAW stuff */ if (protocol != 0)...原创 2019-01-05 01:13:10 · 781 阅读 · 0 评论 -
uninx域基础数据结构及操作
struct unix_proto_data unix_datas[NSOCKETS_UNIX]#define last_unix_data (unix_datas + NSOCKETS_UNIX - 1) // 数组的最大边界unix_datas变量维护个数组,每个元素是unix_proto_data 结构。struct unix_proto_data { int refcnt;...原创 2019-01-05 00:13:48 · 286 阅读 · 0 评论 -
connect函数源码分析
1 执行socket.c的sock_connect2 执行af_inet.c的inet_connect3 执行tcp.c的tcp_connect发送一个syn包进入TCP_SYN_SENT状态。4 返回inet_connect,判断sock的状态为还没建立连接则阻塞当前进程。设置了非阻塞模式则直接返回。5 客户端返回ack包,执行tcp.c的tcp_rcv,修改状态为TCP_ESTABLI...原创 2018-12-31 02:43:45 · 732 阅读 · 0 评论 -
packet协议源码解析
packet协议和raw协议都是操作系统给用户层提供的可以直接访问底层协议的接口,packet协议把raw更加底层,raw协议是由用户构造ip头和数据部分,mac层收到数据包的时候,先给ip层,ip层根据ip头中的协议字段分发给对应的raw套接字和对应的上层协议。packet协议是由用户构造mac头和数据部分,系统只负责发送和接收,mac头收到数据包的时候,根据mac头判断出上层协议,然后遍历pa...原创 2019-02-15 22:15:31 · 1962 阅读 · 0 评论 -
tcp/ip协议栈初始化源码解析
首先在操作系统初始化的时候会执行sock_init函数,该函数执行proto_init和dev_init,并且注册一个下半部分的处理函数,用于数据包到达后的处理。// 操作系统初始化时,在main函数里执行该函数void sock_init(void){ int i; printk("Swansea University Computer Society NET3.019\n");...原创 2019-02-15 23:41:45 · 621 阅读 · 0 评论 -
tcp紧急数据处理源码浅析
tcp紧急数据用于一端有紧急通知需要告之对端的时候,他传输的其实是一种命令或者说信号,而不算是数据,因为他只有一个字节。对端收到紧急数据后会给对应的进程发送一个信号,通知该进程有紧急的命令需要处理(前提是设置了进程或者进程组来处理紧急数据)。下面看一下紧急数据的发送。入口函数是tcp_write。关键代码如下。之前缓存了小量数据,还没发送。紧急则追加到该skb中发送。if ((skb = ...原创 2019-02-19 23:32:45 · 570 阅读 · 0 评论 -
应用层发送一个数据包的时候,是如何到达网卡的(上)
该函数实现了tcp协议发送数据的逻辑。/* * This routine copies from a user buffer into a socket, * and starts the transmit system. */static int tcp_write(struct sock *sk, unsigned char *from, int len, int nonbl...原创 2019-02-12 14:59:04 · 1436 阅读 · 0 评论