- 博客(53)
- 资源 (6)
- 收藏
- 关注
原创 UDP send 出现大量“Resource temporarily unavailable”
至此,我们已经分析开头所说困惑,一个小小的“Resource temporarily unavailable”错误,背后蕴藏着太多技术细节,如果得过且过将来必成后患。工作中遇到的每个小问题,背后都蕴藏着大量知识,只有平时多积累总结,才能游刃有余解决所面对的问题。
2024-03-28 18:10:13 1510
原创 数据报文去哪儿了
经过分析我们可以总结我们遇到的问题,1,通过scapy打流测试,为什么bpftrace没有捕获到大量的kfree_skb事件?这是因为网卡工作在直接模式(Direct Model)网卡将目的MAC不是自己的直接丢弃,验证这个想象,可以直接使用tcpdump 工具抓包,此时bpftrace 可以捕获大量的kfree_skb事件。2,tcpdump 捕获到去往自己IP的报文,为什么没有到netfilter框架?
2023-11-23 17:08:00 346
原创 GCC 查看编译和链接搜索路径
当我们使用交叉编译工具时,总是出现无法找到头文件或者链接库的问题,一般都是编译工具环境问题,我们可以采用以下方式查询当前头文件或者链接库搜索路径。编译头文件搜索路径:echo "" | gcc -v -x c -E -gcc -v -x c -E empty.c链接库搜索路径:ld --verbose | grep SEARCH | sed 's/;[ ]/\n/g'SEARCH_DIR("/usr/x86_64-linux-gnu/lib64")SEARCH_DIR("=/u
2022-04-22 09:49:57 2509
转载 利用nf_conntrack机制存储路由,省去每包路由查找
IP是无连接的,因此IP路由是每包一路由的,数据包通过查找路由表获取路由,这是现代操作协议协议栈IP路由的默认处理方式。但是如果协议栈具有流识别能力,是不是可以基于流来路由呢?答案无疑是肯定的。设计思想在Linux的实现中,nf_conntrack可以做到基于流的IP路由,大致思想就是,仅仅针对一个流的第一个正向包和第一个反向包查找标准的IP路由表,将结果保存在conntrack项中,后续的属于同一流的数据包直接取出路由项来使用。背后的思想是:这可以省去查找路由表的开销,是这样吗?也不全是!关键是,将一
2021-07-22 16:50:38 610
转载 如何扩展Linux的ip_conntrack
Linux中有一个基于Netfilter的连接跟踪机制,即ip_conntrack,每一个conntrack表示的就是一个流,该流里面保存了大量的信息字段,这些字段本地有效,指导着数据包的转发策略,但是我觉得这些字段信息还不够详细,试想,一个nfmark字段好像就可以做到一切了,但是我如果想为一个数据流绑定一个字符串怎么办呢?也许你会说使用iptables+ipset+nfmark可以完成一切,这也是UNIX/Linux哲学的风格,一种后现代主义的风格,但是最近我上了不归路,非要在ip_conntrack里
2021-07-22 15:54:23 305 1
转载 拆解 Linux 网络包发送过程
转载文章:https://mp.weixin.qq.com/s/rpEoQT0aVbJqiaB_2XWVmQ大家好,我是飞哥!半年前我以源码的方式描述了网络包的接收过程。之后不断有粉丝提醒我还没聊发送过程呢。好,安排!在开始今天的文章之前,我先来请大家思考几个小问题。 问1:我们在查看内核发送数据消耗的 CPU 时,是应该看 sy 还是 si ? 问2:为什么你服务器上的 /proc/softirqs 里 NET_RX 要比 NET_TX 大的多的多? 问3:发送网络数
2021-05-13 08:32:25 590
原创 一个历史遗留问题,引发的linux内存管理的‘血案’
最近处理一个骨灰级历史残留问题,内核模块DPI的内存数据被无故关顾,导致系统的panic的问题,linux 内核版本3.18 x86_64,由于我们要精简系统,许多调试工具已经被阉割,SLAB_DEBUG, KASAN not support, 由于这部分数据主要是查询,在初始化话不会对其进行修改,所以想到一个办法将初始化完DPI后,将使用的内存页设置为只读,通过stack的信息找到元凶。按照以上的分析总共分为以下步骤:查找 虚拟地址的PTE 设置PTE的属性为只读#include <l
2021-04-22 16:51:30 712
原创 linux 内存显示括号内字母的含义
当linux系统发生异常或者 echo 'm' > /proc/sysrq-trigger 我们会看到类似以下的信息,其中括号内字符代表什么含义呢?我们跟踪 sysrq-trigger,看看源码的解释DMA: 1*4kB (M) 0*8kB 1*16kB (M) 2*32kB (UM) 2*64kB (UM) 1*128kB (U) 2*256kB (UM) 2*512kB (UM) 1*1024kB (M) 1*2048kB (M) 2*4096kB (ER) = 13140kBDMA32:
2021-04-08 11:47:01 535
原创 CPU 乱序执行验证
受到一个问题:linux kernel 为什么加 smp_mb,怎么引起的,添加后有怎么解决的?最近遇到CPU的乱序问题,总是理论性的东西和讨论,找了个时间写了测试程序,验证CPU乱序执行的存在,理论加实践,才能理解的更加深刻/* this program test CPU out of order execute. ENV: CPU need more than two core thread gcc -Wall -O3 out_of_order
2021-03-24 17:47:44 486
转载 25匹马,找出最快的3匹,但是只有5个赛道,每次比赛只能得到5匹马的速度排序,那么最少需要多少次比赛
笔试题:25匹马,找出最快的3匹,但是只有5个赛道,每次比赛只能得到5匹马的速度排序,那么最少需要多少次比赛在网上搜了下答案,好像不靠谱。最后在英文网站上找到正确的答案:? 次参考:http://www.programmerinterview.com/index.php/puzzles/25-horses-3-fastest-5-races-puzzle/1-5 场:将25匹马...
2019-10-23 08:45:30 2204
原创 低版本ulibc支持recvmmsg sendmmsg功能
最近调试openwrt,发现低版本的ulibc不支持recv/send mmsg API,故简单写个实现一个测试程序,直接贴代码吧!,这里的程序可能兼容新版版本的ulibc出现问题,所以使用wrap_简单封装一下。#define _GNU_SOURCE#include <netinet/ip.h>#include <stdio.h>#include <st...
2019-07-03 11:09:39 846
转载 shell逐行读取每一列
在Linux下用shell脚本读取MySQL结果集各数据项的值,按行读取sql结果,将sql执行结果读取到shell变量中,然就可进行处理。方法一:while read -a rowdo echo “.. row[0].. {row[1]}..”done< <(echo “select id ,name from student;” | ${COMMAND1})方...
2019-02-27 11:41:06 3036
转载 AR/QCA SPI 启动原理和 ART 地址定位原理
转自:http://www.right.com.cn本贴主要讲解 Bootloader 是如何在使用 SPI Flash 的 AR/QCA 的芯片上启动的,以及 OpenWrt 代码 ar71xx 的 mach 文件中类似于 u8 *art = KSEG1ADDR(0x1fff0000) 中 0x1fff0000 是如何得来的。楼主之前在 U-Boot 编译教程中进行过简单的描述,但是
2018-01-17 14:58:33 1976
转载 shell中的各种括号的使用方法
from:http://www.jb51.net/article/60326.htm在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下:1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string},${var:=string},${var:?string} 5.$((exp))
2017-11-24 09:08:38 333
转载 linux glob函数详解
glob库函数用于Linux文件系统中路径名称的模式匹配,即查找文件系统中指定模式的路径。注意,这不是正则表达式匹配,虽然有些相似,但还是有点差别。glob函数原型 #include int glob(const char *pattern, int flags, int errfunc(cons
2017-07-13 18:00:51 14504
转载 IPC之IPC_PRIVATE与ftok比较
在Linux中,可以使用IPC对象来进行进程间通信。IPC对象存在于内核中,多进程可以操作同一个IPC对象。每个IPC对象都有一个唯一的编号,该编号是由系统分配的。那么不同的进程如何知道这个编号,进而通过它进行通信呢?下面以共享内存为例,进行分析。方法一:通过ftok函数,产生相同的键值。假设,进程p1创建了共享内存。可以在创建时,调用ftok函数,得到一个key值,调用s
2017-03-06 07:07:45 1126
转载 Ubuntu14.04 YouCompleteMe Configure
安装准备1.1 安装vim[cpp] view plaincopysudo apt-get install vim 1.2 安装cmake[cpp] view plaincopysudo apt-get install cmake 1.
2016-01-09 12:34:38 1827
原创 结构体对齐详解
一、字节对齐的规则:1、一般设置的对齐方式为1,2,4字节对齐方式。结构的首地址必须是结构内最宽类型的整数倍地址;另外,结构体的每一个成员起始地址必须是自身类型大小的整数倍(需要特别注意的是windows下是这样的,但在linux的gcc编译器下最高为4字节对齐),否则在前一类型后补0;这里特别提到的是数组一定要注意,而且在一些编程的技巧中,我们可以使用数组强制字节达到对齐的目的。这在网络
2014-11-17 16:27:19 5472
转载 同一进程中同一端口如何区分不同的Socket
为了区分不同应用进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP 或 UDP)和使用的端口号。 Socket的原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。 accept()产生的Socket端口号是多少?
2014-08-29 17:58:42 10421 4
转载 select 详解
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式
2014-08-29 17:11:34 1134
转载 子网掩码详解分析
一、 子网掩码的概念及作用 子网掩码 (subnet mask) 又叫网络掩码、地址掩码、子网络遮罩,是一个应用于 TCP/IP 网络的 32 位二进制值。它可以屏蔽掉 IP 地址中的一部分,从而分离出 IP 地址中的网络部分与主机部分,基于子网掩码,管理员可以将网络进一步划分为若干子网。它必须结合 IP 地址一起使用。二、 为什么需要使用子网掩码 虽然我们
2014-08-20 15:14:55 904
转载 scanf family API 高级用法
如何解释 fscanf(fd,"%*[^\n]")"%[^\n]"表示读输入字符串,直到碰到字符‘\n’为止,其中^表示否的意思sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。但新手可能并不知道处理字符串时的一些高级用法,这里做个简要说明吧。 1. 常见用法。 以下是引用片段: cha
2014-08-08 14:48:56 611
转载 IO多路复用之select篇
1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。 (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。
2014-06-05 19:18:52 676
转载 EIP寄存器
EIP寄存器,用来存储CPU要读取指令的地址,CPU通过EIP寄存器读取即将要执行的指令。每次CPU执行完相应的汇编指令之后,EIP寄存器的值就会增加。 一、因为80386 CPU的寻址范围是4GB,所以它的寻址模式是平坦模式的。CPU通过读取EIP寄存器执行汇编指令的大致过程如下:1. 首先PE loader装载我们的PE文件,读取PE文件的基地址和入口RVA地址(相对于基地址的偏移
2014-05-14 14:53:19 21622 1
原创 Push, Pop, call, leave 和 Ret 指令图解
帧栈结构图:最近在研究如何在程序crash定位出错函数,补充的计算机系统基础知识。此篇主要是介绍IA32中帧栈结构(frame stack).
2014-05-14 14:32:27 63934 2
原创 常用寄存器及其说明
通用寄存器EAX累加(Accumulator)寄存器AX(AH、AL)常用于乘、除法和函数返回值EBX基址(Base)寄存器BX(BH、BL)常做内存数据的指针, 或者说常以它为基址来访问内存.ECX计数器(Counter)寄存器CX(CH、CL)常做字符串和循环操作中的计数器
2014-05-09 18:48:28 7067
转载 浅谈malloc,calloc,realloc函数之间的区别
内存区域可以分为栈,堆,静态存储区和常量存储区。局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的。 C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数。使用这些函数需要包含头文件stdlib.h1. malloc函数malloc函数可以从堆上获得指定字节的内
2014-05-09 18:37:55 595
转载 AT&T汇编leave指令
最近在看c程序的编译出来的汇编文件,发现涉及到函数调用的地方,在返回时有的时候使用的leave,有的时候直接使用的是popl %ebp。在AT&T汇编中,leave等效于以下汇编指令:movl %ebp, %esppopl %ebp为什么有的时候会使用leave,有的时候直接使用popl %ebp?这个问题一开始我也没搞懂,后来通过分析堆栈才有点清醒。二者的差别就在于是否使用
2014-05-07 15:13:02 7229 1
转载 嵌入式LINUX环境下视频采集知识
Video for Linux two(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。一、Video for Linux two 在Linux下,所有外设
2014-02-12 17:28:22 3237
转载 SYSCALL_DEFINE含义
CVE-2010-3301是其中一个。这个漏洞的成因是,在64位的内核上执行32位的系统调用时,作为传递系统调用号的%rax高32位未被清零处理,而且在进行比较的时候直接使用的%eax,导致高32位被忽略:cmpl $(IA32_NR_syscalls-1),%eax ja ia32_badsys ia32_do_call: IA32_ARG_FIXUP call *ia32_sys_
2014-01-14 09:55:37 799
转载 linux下的系统调用函数到内核函数的追踪
Original from: http://blog.chinaunix.net/uid-28458801-id-3468966.html使用的 glibc : glibc-2.17使用的 linux kernel :linux-3.2.07系统调用是内核向用户进程提供服务的唯一方法,应用程序调用操作系统提供的功能模块(函数)。用户程序通过系统调用从用户态(user mod
2014-01-13 11:03:20 950
原创 Linux/Unix the definition of cpu-nice
这是个Linux/Unix术语。Linux/Unix 是多用户分时操作系统,一个主机上连很多用户。nice是一种礼让的工具,可以给自己不着急出结果的程序安排优先级(除了管理员,别人只有增加的权利——表示优先级的数字,默认是0,越大优先级越低)。比如压缩片子的进程,可以用活动监视器看进程号,然后到终端下输入renice 20 -p 进程号,就不会影响到其他操作了。当然,在你什么都不做的时候,cp
2013-05-18 10:15:26 640
转载 RedHat YUM configure
RedHat企业版免费使用的用户,大家都知道,他的服务是收费的,没有注册码是不提供服务的,包括yum服务,这里如果我们非要使用Redhat 企业版的话,为了方便管理,我们自己搭建本地YUM,步骤如下:1,创建存放RPM包源的目录mkdir -p /usr/local/src/yum2,挂载安装盘mount /dev/cdrom /mnt3,复制所有安装里的RPM包到
2013-04-16 11:07:06 1176
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人