Liunx内核
文章平均质量分 64
Mrpre
??
展开
-
ipvs 导致syn 重传问题
(本篇讲的是IPVS自身到指的syn重传,和RS的PAWS没关系)sysctl_conn_reuse_mode 为0 时,如果当前IPVS的session是TIME_WAIT或者其他状态,任何进来的packet都会根据当前的session进行转发。这就造成一个问题,如果客户端请求都是短连接,那么IPVS的session都是TIME_WAIT状态,如果客户端来了一个SYN包,那么SYN包也会将当前的session变成SYN_RECV,然后不会重新调度RS。特别是,如果我们将RS权重为0,此时一个SYN过来原创 2022-05-23 17:50:43 · 936 阅读 · 0 评论 -
ip_forward 如何影响IPVS转发流程
先理清几个概念/proc/sys/net/ipv4/ip_forward 等价于下面的 /proc/sys/net/conf/all/forwarding/proc/sys/net/ipv4/conf/xx/forwarding 针对指定的dev xx进行设置/proc/sys/net/ipv4/conf/all/forwarding 需要对当前所有device进行设置,当然不同的属性,all 的逻辑不一样,需要one by one的的看/proc/sys/net/ipv4/conf/defa原创 2022-05-19 14:18:50 · 815 阅读 · 0 评论 -
PAWS 到底是什么
名词PAWS : Protection Against Wrapping SequenceISN: Init sequence NumberSEQ 回环TCP的 seq 是一个u32的递增数字,SYN和FIN会消耗一个seq,其次每个TCP的payload都会消耗对应长度的seq,也就是说,对于每一个TCP连接而言,seq是单调递增的,所以u32会溢出于是就回环了,回环本身没有什么问题,常见的通过将seq强转成有符号比较,if ((s32)current > (s32)last),永远能简单高原创 2022-05-07 16:36:12 · 1977 阅读 · 0 评论 -
netlink 读取数据流程
前言本篇缘起是我要实现类似ss -i 的功能,通过netlink获取系统中的所有socket信息代码如下//发送tcpdiag的数据sendto(netlinkdf, msg,...)//sleep足够时间,使得内核处理//因为每次都读取少部分数据,以为内核没来得及处理sleep(10)char buffer[10000]len = recvfrom(buffer, sizeof(buffer), 0);上面流程中,recvfrom 返回的字节大小,小于buffer大小,理应我们认为原创 2022-04-23 21:23:32 · 1351 阅读 · 0 评论 -
tcp_diag 内核相关实现 以及调用层次
tcp_diag 内核相关实现前言tcp_diag 是一个内核模块,本文的目的是梳理调用关系,如果从用户态的socket一路调用到tcp_diag模块dump出所有socket的。大致分层关系 总结如下:netlink层->sock_diag层->inet_diag层->tcp_diag用户态代码类似 ss 功能的代码可以从 https://man7.org/linux/man-pages/man7/sock_diag.7.html 中获得,但是它只是打印 unix_socket原创 2022-04-22 16:09:19 · 4158 阅读 · 0 评论 -
kprobe 的 3 种使用
知识背景:会编写基础内核模块kprobe用处:用来跟踪、记录、打桩。最常见的使用就是需要打印内核函数的执行流程,比如排查问题时、或者学习内核流程时需要用到。准备工作:找一份和自己linux系统相同版本的源码(方法自行Google,ubuntu、centos、redhat各自有各自方法)内核模块跟踪指定函数官方文档:https://www.kernel.org/doc/Documentation/kprobes.txt在 内核源码目录samples/kprobes/有几个kprobe模块例子,.原创 2020-06-17 10:22:56 · 5148 阅读 · 4 评论 -
pipe函数内核实现
pipe源码分析本文基于linux kernel 4.13 分析,与通用的2.6差距较大。请读者自行甄别本文的特性,是否符合自己当前环境。本文要解决的问题1:pipe源码分析2:pipe大小限制3:如果没有读(写)端了,那么我写(读)操作会发生什么。父子进程之间通信,首先想到的是pipe函数,pipe函数返回2个fd。通常原创 2017-12-09 17:32:10 · 4446 阅读 · 0 评论 -
调用malloc时发生了什么(2) - sys_brk函数与VMA
调用malloc时发生了什么(2) - sys_brk函数在上一篇中我们讲过,malloc实际调用了brk函数完成堆的分配,也了解了进程的内存布局。现在我们来看看,进程的内存布局到底是怎么实现的。具体如何堆指针增加减少的。增加减少,堆进程的影响是什么?一系列的问题等着我们去解决。sys_brk函数(去掉了与本篇无关的代码)SYSCALL_DEFINE1(brk, unsigned原创 2018-01-20 17:24:00 · 1197 阅读 · 2 评论 -
Linux 大页内存 的使用
Hugepage 大页内存 的使用系统启用大页内存下述操作,需要重启机器。不建议 通过 设置 echo 1G > /proc/sys/vm/nr_hugepages的方式设置,因为系统不一定成功。设置大页内存的PAGESIZECentos 下(其他发行版本自行Google)grubby --update-kernel=ALL --args="hugepagesz=1G defau...原创 2018-10-31 16:49:39 · 6295 阅读 · 0 评论 -
perf 统计缺页中断 和TLB miss
perf 统计 内存相关eventperf 可探测 的所有 event ,均可以使用命令perf list获得。本文举几个和内存相关的性能的几个event例子探测 进程 的缺页中断数(page fault)perf stat -e faults ./mem能够统计 ./mem 执行 周期内,引发的 缺页中断数。Performance counter stats for './mem':...原创 2018-10-30 10:00:48 · 5878 阅读 · 0 评论 -
大页内存 初始化
大页内存 初始化hstates所有的大页均放在 hstates 的全局变量中。mm/hugetlb.cstruct hstate hstates[HUGE_MAX_HSTATE];每个 hstates 数组的元素,均表示一种大小的page,其中 HUGE_MAX_HSTATE的值为2,这也就解释了为什么hugepage目前只支持2个pagesize。当前系统有多少个类型 的hugepa...原创 2018-11-02 16:41:37 · 1229 阅读 · 0 评论 -
调用malloc时发生了什么(3) - 缺页中断
页表的创建kmalloc内存使用了umapped内存,直接对地址偏移即可寻址物理内存,这里不考虑。考虑用户态内存和vmalloc,都用到了虚拟内存,即需要通过页表查询的方式查询都物理内存。例如 用户态通过brk申请了一块内存,后续访问这块内存的0x00007F88F16A4690这块地址会发生什么?首先,X64内核是4级页表,根据X64对线性地址的划分,可以计算出0x00007F88F16...原创 2018-11-02 18:12:47 · 1724 阅读 · 0 评论 -
tcp_tw_reuse对客户端的作用
tcp_tw_reuse对客户端的作用客户端频繁建立连接然后主动关闭连接,会产生大量TIME_WAIT,此时,如何快速利用TIME_WAIT呢?必须满足下面所有条件:客户端:/proc/sys/net/ipv4/tcp_tw_reuse 为 1/proc/sys/net/ipv4/tcp_timestamps 为 1 TIME_WAIT socket 生存时间超过1秒服务端:...原创 2019-04-16 10:48:56 · 2604 阅读 · 0 评论 -
进程间文件描述符传递原理
进程间文件描述符传递原理进程中文件的管理以及fork每个进程的文件描述符是独立的,即一个进程打开的文件描述符是记录在进程对象上的(task_struct)。task_struct { files_struct *files;}files_struct { struct fdtable __rcu *fdt;}fdtable { struct file _...原创 2019-06-06 13:36:13 · 2599 阅读 · 0 评论 -
调用malloc时发生了什么(1) - brk与sbrk
调用malloc时发生了什么这或许是老生常谈的问题,也是面试中经常碰到的问题,有人简单的几句话就回答完了,有人却能大谈特谈。疑问进程的堆栈结构malloc是否会占用内存malloc对应的系统调用malloc返回的地址free函数干了什么一般,我们在需要申请内存的时候,需要执行malloc(),分配内存,需要注意的是,malloc()是glibc函数,其实际对应的系统原创 2018-01-13 21:22:00 · 4772 阅读 · 0 评论 -
TCP三次握手时客户端ACK捎带数据
今天碰到一个奇葩的问题,一直跑的好好的程序,碰到某个服务器就不行了。当前流程:client serverSYN -------------------><------------------------SYN ACKdata with ack bit------> 客户端发送data后服务器一...原创 2017-09-20 15:45:37 · 2487 阅读 · 0 评论 -
linux 内核定时器 timer_list
linux内核使用timer_list 结构体当作定时器。点击(此处)折叠或打开#include linux/timer.h>#include linux/module.h>MODULE_LICENSE("GPL"); //不加这句话,虽然不影响功能,但“有时候”程序执行时会打印错误,类似 Disa原创 2013-12-22 17:17:26 · 3431 阅读 · 0 评论 -
Linux虚拟化基础之命名空间
Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一。该数据结构在内核文件 include/linux/sched.h 中定义,在Linux 3.8 的内核中,该数据结构足足有 380 行之多,在这里我不可能逐项去描述其表示的含义,本篇文章只关注该数据结构如何来组转载 2014-05-09 13:21:42 · 8205 阅读 · 1 评论 -
setsockopt 内核实现
linux kernel 对于 setsockopt 函数的实现处理。原创 2014-04-24 09:04:56 · 7322 阅读 · 0 评论 -
Linux tcp被动打开内核源码分析
linux内核tcp被动打开内核源码分析原创 2014-04-28 22:08:50 · 2725 阅读 · 0 评论 -
accept系统调用内核实现
linux内核原创 2014-06-20 22:53:10 · 3053 阅读 · 0 评论 -
linux内核计算时间差以及jiffies溢出
linux内核原创 2014-06-01 00:42:52 · 5234 阅读 · 0 评论 -
prequeue和backlog和receive
网上找了很多文章,对于基础不太好的我来说,原创 2014-06-18 22:33:08 · 2823 阅读 · 0 评论 -
inet_sock 中num和sport的区别
struct inet_sock { /* sk and pinet6 has to be the first two members of inet_sock */ struct sock sk;#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) struct ipv6_pinfo *pinet6;#endif /* So原创 2014-06-18 00:15:05 · 1888 阅读 · 0 评论 -
tcp_recvmsg 函数详解
linux内核关于tcp_recvmsg的实现详解原创 2014-06-22 19:01:07 · 10031 阅读 · 1 评论 -
Bootmem
Bootmem是系统启动时的内存管理器,当伙伴系统初始化后,bootmem就会被free,存在时间较短,但是在伙伴系统初始化之前的内核其他初始化, 均需要依赖于bootmem,且了解bootmem能够帮助理解伙伴系统。 Bootmem使用位图来表示哪些页框被使用吗,例如系统是100兆内存,bootmem需要管理这100兆内存,一个页大小为1k,,总共102400个页(100m/1k),原创 2017-06-03 10:34:21 · 632 阅读 · 0 评论 -
关于UDP接收icmp端口不可达(port unreachable)
本篇分为3部分1:报文格式2:产生的原因3:linux协议栈如何处理4:应用层如何获取1:报文如下,10.30.13.1往10.30.16.10的80端口发送了一个UDP报文,80端口其实监听的是TCP。服务器回复了一个类型为端口不可达的ICMP,ICMP数据部分就是请求UDP ip层及其以上的数据。2:原因 首先原因就是接收udp报文...原创 2015-02-03 17:18:34 · 119830 阅读 · 13 评论 -
netlink实现用户态和内核态数据交互
本文代码实现:用户进程发送“nihao”给内核,内核回复“niyehao”给用户态。1:netlink.h添加自己的宏。2:编写用户态程序。3:编写内核态程序。内核态,需要全局变量进行数据的交互。在模块init的时候,可以:netlinkfd = netlink_kernel_create(&init_vrf, NL_MY, 0, kernel_rece原创 2017-09-20 15:27:48 · 1504 阅读 · 0 评论 -
linux内核路由模块fib_valid_source函数(反向路由检测)
表示对linu内核查路由的的效率表示堪忧。一个经过linux的报文,无论是上送本机,还是转发,都会进行大于等于2次的查路由动作。即执行大于等于2次的fib_lookup。外部包过来,ip_rcv->ip_rcv_finish->ip_route_input->ip_route_input_slowip_route_input_slow判断报文是否转发,还是上送本机即ip_forward原创 2017-09-20 15:34:29 · 3209 阅读 · 0 评论